4

Cでバイナリファイルを読み取る際に次の問題が発生しています。

バイナリ ファイルの最初の 8 バイトを読み取りました。次に、9 バイト目から読み取りを開始する必要があります。コードは次のとおりです。

fseek(inputFile, 2*sizeof(int), SEEK_SET);

ただし、取得した値を格納する配列の内容を出力すると、最初の 8 バイトが表示されますが、これは必要なものではありません。

誰でもこれで私を助けてもらえますか?

4

2 に答える 2

11

仮定:

FILE* file = fopen(FILENAME, "rb");
char buf[8];

最初の 8 バイトを読み取ってから、次の 8 バイトを読み取ることができます。

/* Read first 8 bytes */
fread(buf, 1, 8, file); 
/* Read next 8 bytes */
fread(buf, 1, 8, file);

または、最初の 8 バイトをスキップして、次の 8 バイトをfseek読み取ります (ファイルの最初のバイトを 0 としてカウントする場合、8 .. 15 を含む):

/* Skip first 8 bytes */
fseek(file, 8, SEEK_SET);
/* Read next 8 bytes */
fread(buf, 1, 8, file);

これを理解するための鍵は、C ライブラリ関数がファイル内の現在の位置を自動的に保持することです。fread読み取り操作を実行するときに移動するため、fread前の操作が終了した直後に次の操作が開始されます。fseek読まずに動かすだけです。


PS: ここでの私のコードは、あなたの質問に応じてバイトを読み取ります。( の 2 番目の引数として指定されたサイズ 1 fread)

于 2010-04-02T05:33:11.903 に答える
10

fseekファイル ストリームの位置ポインタを移動するだけです。位置ポインターを移動したら、fread実際にファイルからバイトを読み取るために呼び出す必要があります。

ただし、 を使用してファイルから最初の 8 バイトを既に読み取っている場合fread、位置ポインターは 9 番目のバイトを指しているままになります (もちろん、エラーが発生せず、ファイルの長さが少なくとも 9 バイトであると仮定します)。を呼び出すとfread、読み取ったバイト数だけ位置ポインタを進めます。移動するために電話する必要はありませんfseek

于 2010-04-02T03:13:34.580 に答える