ページ 11

ファイルの読み込み

Posted: 2010年10月03日(日) 16:28
by kokuoutyou
ネット上にあるファイル(test.txt)
を読み込む事とって出来ますか?

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 16:45
by みけCAT
めんどくさいのでDLLを使ってみてはどうですか?
http://hira.hopto.org/
のhttpget.dllを使ってみてください。
#include <stdio.h>
#include <windows.h>

static HMODULE s_hm;
static int (__stdcall *GetHttpData)(char*,char*,int,int);

int main(void) {
    char buf[1000000];
    s_hm = LoadLibrary("httpget.dll");
    if(s_hm==NULL) {
        printf("error1\n");
        return 1;
    }
    GetHttpData=GetProcAddress(s_hm, "GetHttpData");
    if(GetHttpData==NULL) {
        printf("error2\n");
        return 1;
    }
    GetHttpData("http://127.0.0.1/test.txt",buf,sizeof(buf),0);
    puts(buf);
    return 0;
}
http://127.0.0.1/test.txtの部分は適切なアドレスに書き変えてください。

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 16:50
by みけCAT
簡単に答えてしまいましたが、「ネット上にあるファイルを読み込む」と言っても
httpやftpなどのいろいろなプロトコルがあります。
上の方法はhttpの場合のみ使えます。

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 16:52
by みけCAT
まじめにやるならこのサイトなどを参考にしてみてください。
http://www.nakka.com/lib/inet/httpc.html
ただしこれもhttpの場合のみです。
ftpの場合はこちらが参考になるかもしれません。
http://x68000.q-e-d.net/~68user/net/ftp-1.html

(追記)
下のサイトは、C言語の場合はこっちでした。
http://x68000.q-e-d.net/~68user/net/c-ftp-1.html 画像

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 18:17
by kokuoutyou
エラー 1 error C2664: 'LoadLibraryW' : 1 番目の引数を 'const char [12]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)

エラー 2 error C2440: '=' : 'FARPROC' から 'int (__stdcall *)(char *,char *,int,int)' に変換できません。
て出てきますがどうしてでしょうか?

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 19:11
by みけCAT
VCを使っているのですね。
対処法はまた後で調べたいと思います。

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 19:29
by めるぽん
試していないのですが、最初のエラーは、
s_hm = LoadLibrary(_T("httpget.dll")); // _T がダメなら TEXT で
として、2番目のエラーは
GetHttpData = (int (__stdcall*)(char*,char*,int,int))GetProcAddress(s_hm, "GetHttpData");
とすれば動くかもしれないです。 画像

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 19:42
by みけCAT
_Tを使うにはヘッダのインクルードが必要だった気がします。
tchar.hかtext.hだったかな?
違っていたらすみません。

Re:ファイルの読み込み

Posted: 2010年10月03日(日) 21:40
by lbfuvab
プロジェクトの設定をマルチバイト文字にすればそのままでいけませんか?

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 01:52
by めるぽん
_T を使うには tchar.h のインクルードが必要ですね。
TEXT マクロは winnt.h に定義されていて、これは windows.h の中でインクルードされているので、windows.h をインクルードすれば使えます。

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 13:23
by kokuoutyou
実行は出来ましたけど
error1って出てきて意味が分かりません


#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#include <windows.h>

static HMODULE s_hm;
static int (__stdcall *GetHttpData)(char*,char*,int,int);

int main(void) {
char buf[1000000];
s_hm = LoadLibrary(_T("httpget.dll")); // _T
if(s_hm==NULL) {
printf("error1\n");
while(true);
return 1;
}
GetHttpData = (int (__stdcall*)(char*,char*,int,int))GetProcAddress(s_hm, "GetHttpData");
if(GetHttpData==NULL) {
printf("error2\n");
while(true);
return 1;
}
GetHttpData("http://share.kokuoutyou.server.co.jp/test.txt",buf,sizeof(buf),0);
puts(buf);
while(true);
return 0;
}

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 13:33
by kokuoutyou
_Tと_TEXTでも出来ませんでした

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 14:00
by kokuoutyou
出来ましたw
読み込めましたけど文字化けして読めません

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 14:22
by toyo
文字列の終端が無いためではないでしょうか
char buf[1000000] = {0};
で初期化してみてください

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 14:27
by kokuoutyou
出来ました
(@^▽^@)
ありがとうございます
゜+。゜感謝★☆(´∀`人)☆★感激゜。+゜
教えてくれた皆さん本当にありがとうございました

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 14:27
by kokuoutyou
解決いたしました

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 14:30
by kokuoutyou
あのー
一行ずつ読み取るにはどうしたらいいでしょうか?

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 15:14
by softya
自分で改行コードを判定して一行に分解してください。

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 16:04
by kokuoutyou
char b[100][100]={0};
char a[10000]={0};
int g=0;

for(int i=0;i<10000;i++)
{
if(a=='\\'){if(a[i+1]=='n'){g++}}
else{b[g]=a;}
}

↑で出来ますかね?

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 16:46
by softya
プログラミングの勉強のためには、まず試してみることが大事ですよ。
確認手段が分からないなら聞いてください。デバッガとか使えますか?
または、printfしても良いですね。

注意点だけ。
改行コードが1バイトか2バイトかはWindows/Linuxなどの環境に依存します。
http://ja.wikipedia.org/wiki/%E6%94%B9% ... C%E3%83%89
なので'\n'は改行コードですので1バイトか2バイトの場合がありえますが、'\n'を2つに分解したら意味がまったく違います。'\\'は単なる\の文字で'n'は単なる小文字のエヌです。
なのでif(a=='\\'){if(a[i+1]=='n')は間違いです。
それとデバッガで追いかけると分かりますが、b[g]=a;は非常にまずいことになります。

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 21:46
by みけCAT
これでどうでしょうか。
#include <stdio.h>
#include <string.h>

int bunkatu(char**,char*);

int main(void) {
    /*改行コードが混ざっていても大丈夫*/
    /*改行が連続しても大丈夫*/
    char taisyou[/url]="abc\r\ndef\nghi\rjkl\r\n\r\naa\n\nbb\r\rcc";
    int i;
    char** saisyo;
    int lines;
    lines=bunkatu(NULL,taisyou);
    saisyo=calloc(lines,sizeof(char*));
    bunkatu(saisyo,taisyou);
    for(i=0;i<lines;i++) {
        printf("%3d行目:[%s]\n",i+1,saisyo); 
    }
    free(saisyo);
    return 0;
}

/*
 result:各行の先頭のポインタを入れる配列のポインタ
        NULLにすると行数のみを取得する。
taisyou:行ごとに分割する対象の文字列
        分割するとこの文字列が直接書き変わる。
        resultをNULLにした場合は書き変わらない。
 戻り値:分割した行数 
*/
int bunkatu(char** result,char* taisyou) {
    int i;
    int lines=1;
    int status=0;
    if(result!=NULL) {
        result[0]=taisyou;
    }
    for(i=0;taisyou!=0;i++) {
        if(taisyou==0x0D) {
            if(status) {
                if(result!=NULL)result[lines]=&taisyou;
                lines++;
            }
            status=1;
            if(result!=NULL)taisyou=0;
        } else if(taisyou==0x0A) {
            if(status==2) {
                if(result!=NULL)result[lines]=&taisyou;
                lines++;
            }
            status=2;
            if(result!=NULL)taisyou=0;
        } else {
            if(status) {
                if(result!=NULL)result[lines]=&taisyou;
                lines++;
            }
            status=0;
        }
    }
    return lines;
}

Re:ファイルの読み込み

Posted: 2010年10月04日(月) 23:13
by たかぎ
自分のプログラムに機能を組込みたいのであれば、libcurlを使うのが一番簡単な気がします。
http://curl.haxx.se/libcurl/
これなら、httpだろうがhttpsだろうが、はたまたftpだろうがftpsだろうが、難なく読めてしまいます。

外部プログラムを使ってよいのであれば、wgetが一番楽だと思います。
http://gnuwin32.sourceforge.net/packages/wget.htm