在C中读取二进制文件的奇怪之处

时间:2012-10-26 16:43:13

标签: c pointers file-io binaryfiles file-pointer

我在C

中定义了这样的二进制文件
FILE *gfp;
gfp = fopen(gridfiles, "wb");

变量gridfiles存储文件的名称,并且已在前面定义过。现在我在文件中写出两个变量。

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

对于前两个,这是预期的。

但是,如果经过一些其他代码(根本不涉及这些文件),我重复fseek()等,我的输出是

14000 14000

不管我做什么。 我一直试图弄清楚这一段时间......任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:5)

从已在写入模式下打开的流中读取Undefined Behaviour。你应该做到:

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

如果您打算同时阅读和写作。

另外,正如@Kyle Jones在上面的评论中指出的那样,你应该养成在执行文件I / O时检查fread / fwrite的返回状态的习惯 - 这会有很早就发现了你的问题。