为什么这个从文件到 read/write 整数数组的 C 代码不起作用?

Why does this C code to read/write array of integers from file not work?

我有以下 C 代码:

   int a[5] = {1,2,3,4,5};
   int b[5];
   FILE *fp;
   fp=fopen("test","w");
   fwrite(a,sizeof(a),1,fp);
   fread(b,sizeof(b),1,fp);
   for (int i = 0; i < 5; i++) {
      printf("%d ", b[i]);
   }
   printf("\n");

在这段代码中,我创建了一个数组 a,将其写入文件 test,然后尝试将其从文件读取到 b。但是,打印 b 不是 1, 2, 3, 4, 5,而是输出 1, 14, 0, 0, 0

我试过更换

   fwrite(a,sizeof(a),1,fp);
   fread(b,sizeof(b),1,fp);

fwrite(a,sizeof(int),sizeof(a),fp);
   fread(b,sizeof(int),sizeof(b),fp);

得到了相同的结果。

有人知道我做错了什么吗?

您以只写方式打开文件,这意味着读取将失败。该程序在 fread 调用失败时打印垃圾,因此输出位置保持未初始化状态。最好检查 fread 的 return 值并采取适当的措施。

您可以使用 r+w+ 模式打开文件进行读写(它们是相同的,只是 w+ 会先截断文件)。

您可能还需要二进制模式,因为您正在编写原始整数(默认为文本模式,此时流可能会调整行尾并进行其他翻译)。

当使用+模式时,写入后不进行定位操作就不允许读取。所以代码可能是(伪代码):

fp=fopen("test","w+b");
fwrite(a,sizeof(a),1,fp);
rewind(fp);   // same as seeking to the start
fread(b,sizeof(b),1,fp);

在标准C中只有一个文件位置指示器,没有单独的读写位置。要拥有单独的读取和写入位置,您需要使用 fseek 自行管理(并以二进制模式打开文件),或使用一些操作系统工具。