2

特定のオフセットでファイルから読み取ろうとしています (簡易版):

typedef unsigned char u8;
FILE *data_fp = fopen("C:\\some_file.dat", "r");
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset
u8 *data = new u8[0x3F0];
fread(data, 0x3F0, 1, data_fp);
delete[] data;
fclose(data_fp);

問題は、データに 1008 バイトではなく 529 バイトが含まれることです (ランダムなようです)。529 バイトに達すると、feof(data_fp) の呼び出しが true を返し始めます。

また、小さなチャンク (一度に 8 バイト) を読み込もうとしましたが、まだそこにないときに EOF に達しているように見えます。

16 進エディタで単純に見てみると、多くのバイトが残っていることがわかります

4

4 に答える 4

4

あなたがしているように、ファイルをテキストモードで開くと、ライブラリはファイルの内容の一部を他のものに変換し、不当なEOFまたは不正なオフセット計算を引き起こす可能性があります。

「b」オプションをfopen呼び出しに渡して、ファイルをバイナリモードで開きます

fopen(filename, "rb");
于 2010-12-14T16:29:41.903 に答える
1

多分それはテキストファイルとバイナリファイルの違いです。Windowsを使用している場合、改行はCRLFです。これは、ファイル内の2文字ですが、読み取られると1文字にのみ変換されます。fopen(...、 "rb")を使用してみてください

于 2010-12-14T16:31:07.190 に答える
1

ファイルは他のアプリケーションによって並行して書き込まれていますか? おそらく競合状態があるため、読み取りが実行されているときに読み取りが停止した場所でファイルが終了しますが、後で調べると残りが書き込まれています。それはランダム性も説明するでしょう。

于 2010-12-14T16:19:50.873 に答える
0

職場からあなたのリンクを見ることはできませんが、あなたのコンピュータがこれ以上バイトが存在しないと主張するなら、私はそれを信じる傾向があります. 16 進エディタで手動で行うのではなく、ファイルのサイズを出力してみませんか?

また、レベル 2 の I/O を使用したほうがよいでしょう。 f 呼び出しは古くからの C の醜さであり、new があるため C++ を使用しています。

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";

とにかく高速なレベル 2 の I/O 呼び出しを使用してシークと読み取りを行い、ファイルの実際のサイズを見てみましょう。

于 2010-12-14T16:36:11.013 に答える