0

在我下面的代码中,据我所知,该文件正在正确写入。当我查看文件 floats.dat 时,我看到了这个二进制流ÍÌL@33c@ÍÌÜ@ffFAßOeA^@^@bBf6zE33äCff<83>BÍ̦B

但是我的程序总是最终触发这个 if 语句:

if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH)
{
   fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName);
   return EXIT_FAILURE;
}

有人看到我在这里做错了什么吗?完整代码如下。

#include <stdlib.h>
#include <stdio.h>
#define LENGTH 10

int main(void)
{
   FILE *binaryFile, *textFile;
   char *binaryFileName = "floats.dat", *textFileName = "floats.txt";
   float floats[LENGTH] = {3.2, 3.55, 6.9, 12.4, 14.332, 56.5, 4003.4, 456.4, 65.7, 83.4};
   float inputFloats[LENGTH];
   int i;

   if((binaryFile = fopen(binaryFileName, "r+")) == NULL)
   {
      fprintf(stderr, "Problem opening %s", binaryFileName);
   }

   if(fwrite(floats, sizeof(float), LENGTH, binaryFile) < LENGTH)
   {
      fprintf(stderr, "Problem writing some or all data to %s\n", binaryFileName);
      return EXIT_FAILURE;
   }

   printf("DATA WRITTEN SUCCESSFULLY\n");

   if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH)
   {
      fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName);
      return EXIT_FAILURE;
   }

   for(i = 0; i < LENGTH; i++)
   {
      printf("float[%d] = %f\n", i, floats[i]);
   }

   return EXIT_SUCCESS;
}
4

4 回答 4

7
  • 您没有使用文本数据,因此您应该在打开文件时指定二进制模式。使用r+b代替r+
  • 您需要fseek(binaryFile, 0, SEEK_SET)在写入后“倒带”文件。rewind也可以用于这种情况 -fseek允许您将读/写指针定位在您想要的任何位置。
于 2011-04-14T13:26:44.910 回答
1

FILE结构记录了它当前指向的文件中的位置。由于您刚刚写入binaryFile,文件指针位于您所写内容的末尾。

fseek(binaryFile, 0, SEEK_SET);因此,您需要在阅读之前使用回退文件。

于 2011-04-14T13:28:27.100 回答
1

您在阅读文件之前忘记了倒带:

rewind(binaryFile);
于 2011-04-14T13:30:38.033 回答
0

当你完成对文件的写入时,FILE 指针在文件的末尾,所以如果你尝试读取它当然不会工作。在读取之前尝试使用fseek将指针移动到文件的开头。

请避免这种情况:

if((binaryFile = fopen(binaryFileName, "r+")) == NULL) {

并喜欢这个:

binaryFile = fopen(binaryFileName, "rb+");
if(!binaryFile) {
于 2011-04-14T13:28:48.177 回答