【问题标题】:Why does this C code to read/write array of integers from file not work? [closed]为什么这个从文件中读取/写入整数数组的 C 代码不起作用? [关闭]
【发布时间】:2020-06-26 14:35:33
【问题描述】:

我有以下 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() 返回 0。你知道可能是什么原因造成的吗?我需要创建一个新的文件流吗?
  • 您打开一个文件进行写入然后从中读取?
  • @John3136 是的。这是一个初步测试,因为稍后我将尝试打开文件以在不同的函数中读取,但我想确保它首先工作。
  • @RNdev 你为什么希望它工作?

标签: c arrays io filestream


【解决方案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 进行管理(并以二进制模式打开文件),或使用一些操作系统工具。

【讨论】:

  • 这就是答案,谢谢!
猜你喜欢
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2017-08-22
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多