3

私はbittorrentクライアントを書き込もうとしています。ファイルなどを解析するには、トレントファイルをメモリに読み込む必要があります。freadがファイル全体をバッファに読み込んでいないことに気づきました。さらに調査したところ、ファイル内で以下に示す記号が検出されると、freadはファイルの読み取りを停止するようです。FILE *ポインタでfeof関数を呼び出すと、ファイルの終わりに到達したことを示す16が返されます。これは、シンボルが配置されている場所に関係なく発生します。誰かがこれが起こる理由とうまくいくかもしれない解決策を説明できますか?

記号は以下で強調表示されています。

ここに画像の説明を入力してください

読み取り操作を実行するコードは次のとおりです。

char *read_file(const char *file, long long *len){
struct stat st;
char *ret = NULL;
FILE *fp;

//store the size/length of the file
if(stat(file, &st)){
    return ret;
}
*len = st.st_size;

//open a stream to the specified file
fp = fopen(file, "r");
if(!fp){
    return ret;
}

//allocate space in the buffer for the file
ret = (char*)malloc(*len);
if(!ret){
    return NULL;
}

//Break down the call to fread into smaller chunks
//to account for a known bug which causes fread to
//behave strangely with large files

//Read the file into the buffer
//fread(ret, 1, *len, fp);
if(*len > 10000){
    char *retTemp = NULL;
    retTemp = ret;
    int remaining = *len;
    int read = 0, error = 0;
    while(remaining > 1000){
        read = fread(retTemp, 1, 1000, fp);
        if(read < 1000){
            error = feof(fp);
            if(error != 0){
                printf("Error: %d\n", error);
            }
        }
        retTemp += 1000;
        remaining -= 1000;
    }
    fread(retTemp, 1, remaining, fp);
} else {
    fread(ret, 1, *len, fp);
}

//cleanup by closing the file stream
fclose(fp);

return ret;
}

お時間をいただきありがとうございます:)

4

3 に答える 3

5

私が先週ここで働いていたアプリケーションでこの問題に最近遭遇したので、あなたの質問は奇妙に関連しています!

この文字のASCII値は10進数の26(0x1A、\ SUB、SUBSTITUTE)です。これは、CTRL+Zキーシーケンスまたはファイルの終わりマーカーを表すために使用されます。

fopenモードを変更して(「[テキスト]モードでは、CTRL + Zは入力時にファイルの終わり文字として解釈されます。」)、Windowsでこれを回避します。

fp = fopen(file, "rb"); /* b for 'binary', disables Text-mode translations */
于 2012-07-18T18:29:29.043 に答える
4

ファイルをバイナリモードで開く必要があります。一部のプラットフォームは、テキスト(デフォルト)モードで、一部のバイトをファイルマーカーの物理的な終わりとして解釈します。

于 2012-07-18T18:29:10.857 に答える
4

生/バイナリモードではなくテキストでファイルを開いています-矢印はEOFのASCIIです。fopen呼び出しには、単に「r」ではなく「rb」を指定します。

于 2012-07-18T18:30:26.240 に答える