Cでバイナリファイルを読み取る際に次の問題が発生しています。
バイナリ ファイルの最初の 8 バイトを読み取りました。次に、9 バイト目から読み取りを開始する必要があります。コードは次のとおりです。
fseek(inputFile, 2*sizeof(int), SEEK_SET);
ただし、取得した値を格納する配列の内容を出力すると、最初の 8 バイトが表示されますが、これは必要なものではありません。
誰でもこれで私を助けてもらえますか?
Cでバイナリファイルを読み取る際に次の問題が発生しています。
バイナリ ファイルの最初の 8 バイトを読み取りました。次に、9 バイト目から読み取りを開始する必要があります。コードは次のとおりです。
fseek(inputFile, 2*sizeof(int), SEEK_SET);
ただし、取得した値を格納する配列の内容を出力すると、最初の 8 バイトが表示されますが、これは必要なものではありません。
誰でもこれで私を助けてもらえますか?
仮定:
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
)
fseek
ファイル ストリームの位置ポインタを移動するだけです。位置ポインターを移動したら、fread
実際にファイルからバイトを読み取るために呼び出す必要があります。
ただし、 を使用してファイルから最初の 8 バイトを既に読み取っている場合fread
、位置ポインターは 9 番目のバイトを指しているままになります (もちろん、エラーが発生せず、ファイルの長さが少なくとも 9 バイトであると仮定します)。を呼び出すとfread
、読み取ったバイト数だけ位置ポインタを進めます。移動するために電話する必要はありませんfseek
。