0

私はCでこのようなバイナリファイルを定義しました

FILE *gfp;
gfp = fopen(gridfiles, "wb");

変数gridfilesはファイルの名前を格納し、以前に定義されています。次に、2つの変数をファイルに書き込みます。

for(yy = 0; yy < nfiley; yy++) {
   for(xx = 0; xx < nfilex; xx++) {
      filebx = beguv + xx*1E3;
      fileby = enduv - yy*1E3;
      fwrite(&filebx, sizeof(filebx), 1, gfp);
      fwrite(&fileby, sizeof(fileby), 1, gfp);
   }
}

このコードの直後の場合私は

fseek(gfp, 0, SEEK_SET);
fread(&filebx, sizeof(filebx), 1, gfp);
fread(&fileby, sizeof(fileby), 1, gfp);
fprintf(stderr, "%f %f", filebx, fileby);

私の出力は

1000 15000

最初の2つは、予想どおりです。

しかし、他のさまざまなコード(これらのファイルをまったく含まない)の後で、fseek()などを繰り返すと、出力は次のようになります。

14000 14000

私が何をするかに関係なく。私はしばらくの間これを理解しようとしてきました...誰かが私が間違っていることを知っていますか?

4

1 に答える 1

5

書き込みモードで開かれたストリームから読み取るのは未定義の動作です。あなたはそれを作るべきです:

gfp = fopen(gridfiles, "wb+");

読み取りと書き込みの両方を計画している場合。

また、上記のコメントで@Kyle Jonesが指摘しているように、ファイルI / Oを実行するときにfread/の戻りステータスをチェックする習慣を身に付ける必要があります。これにより、問題がはるかに早く検出されます。fwrite

于 2012-10-26T16:54:39.210 に答える