为什么此C代码从文件读取/写入整数数组不起作用?

时间:2020-03-15 04:28:41

标签: c arrays io filestream

我有以下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中。但是,打印1, 2, 3, 4, 5代替b,输出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);

得到相同的结果。

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

1 个答案:

答案 0 :(得分:1)

您已打开该文件仅用于写入,这意味着读取将失败。由于fread调用失败,程序将打印垃圾,因此输出位置保持未初始化状态。最好检查fread的返回值并采取适当的措施。

您可以使用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自己进行管理(并以二进制模式打开文件),或使用某些操作系统工具。