为什么此C代码无法从文件读取/写入整数数组?

问题描述 投票:0回答:1

我有以下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);

并且得到相同的结果。

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

c arrays io filestream
1个回答
0
投票

您已打开文件以仅进行写入,这意味着读取将失败。由于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自行管理(并以二进制模式打开文件),或使用某些操作系统工具。

© www.soinside.com 2019 - 2024. All rights reserved.