0

C++ で FILE オブジェクトを使用して、バイナリ ファイルの断片を読み込んでいます。fseek と対応する fread 呼び出しは次のとおりです。

fseek(fp, startLocation, SEEK_SET);
fread(data, m_sizeOfData, 1, fp);

m_sizeOfData は、最終的に 40 万を超える整数になります。これは、バイナリ ファイルから 40 万以上のバイトすべてをデータ (ちなみに、これは char[m_sizeOfData] です) に読み込む必要があるように見えますが、単純に見える Unicode 文字で約 6 または 7 文字後に停止します。ヌル終了を表しているのではないかと考えていますか? 私はこれについて肯定的ではありません。これは、私が読み込んでいるファイルのすべての部分に当てはまるわけではありません。ほとんどは (一般的に) 正しく動作するようです。

これはなぜでしょうか?また、すべてのデータを正しく読み取る方法はありますか?

編集

fp は次のように定義されます。

FILE* fp;
_wfopen_s(&fp, L"C://somedata.dat", L"rb");

このボックス文字は 16 進数で、0x06 の後に 0x00 が続きます。
データは次のように定義されます: char *data = new char[m_sizeOfData];

編集2

また、別のファイルの末尾にガベージがロードされていることにも気付きました。ゴミは次のようになります。

ýýýý«««««««««îþ

これは、特定のラウンド数のバイトを完了しようとしているからですか?

4

3 に答える 3

1

fread の count/size パラメータを間違った方法で使用しています。バイトを読み取っているため、2 番目のパラメーターは 1 で、3 番目のパラメーターはカウントである必要があります。

fread(data, 1, m_sizeOfData, fp);

その後、fread の戻り値を使用して、読み取られたバイト数を判別できます。予想されるカウントが返されている場合は、必要なすべてのデータを読み取っていることに安心できます。この場合、データを間違って出力している可能性があります。NUL で終了する文字列として扱っている場合、表示されている 0x00 が出力されたものの最後になります。0x06 はおそらくボックス グリフです。

于 2009-10-09T06:30:40.820 に答える
1

あなたが言うところにそれが止まっていることをどのように知っていますか?文字列関数で結果を見ているだけの場合、これらの文字列関数はすべて最初のヌル文字で停止します。実際のデータはさらに大きくなる可能性があります。

于 2009-10-09T03:43:25.290 に答える
0

あなたがWindowsを使用している場合、特にバイナリモードでファイルを開かない限り、ファイルの終わりを示すことができるctrl-Zまたはctrl-Dのような文字がいくつかあると思います

于 2009-10-09T03:47:42.760 に答える