質問

特定のオフセット(簡素化されたバージョン)のファイルから読み込もうとしています。

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に当たっているように見えます。

HEXエディターショーのシンプルな外観 残りのバイトがたくさんあります.

役に立ちましたか?

解決

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

FOPENコールに「B」オプションを渡すことにより、バイナリモードでファイルを開きます

fopen(filename, "rb");

他のヒント

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

たぶん、それはテキストファイルとバイナリファイルの違いです。 Windowsにいる場合、NewLinesはCRLFであり、ファイル内の2文字ですが、読み取ったときに1つだけに変換されます。 fopenを使用してみてください(...、 "rb")

仕事からあなたのリンクを見ることはできませんが、あなたのコンピューターがこれ以上バイトが存在しないと主張する場合、私はそれを信じる傾向があります。 HEXエディターで手作業で物事を行うのではなく、ファイルのサイズを印刷してみませんか?

また、レベル2 I/Oを使用する方が良いでしょう。Fコールは古代のcをしているため、新しいのでC ++を使用しています。

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

レベル2 I/Oコールを使用して探して読んでください。 本当 は。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top