fwrite一直在失败,不知道为什么

时间:2011-04-14 13:22:50

标签: c fwrite

在我的下面的代码中,据我所知,文件正在正确写入。当我查看文件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 个答案:

答案 0 :(得分:7)

  • 您不使用文本数据,因此在打开文件时应指定二进制模式。使用r+b代替r+
  • 写完后你需要fseek(binaryFile, 0, SEEK_SET)来“倒回”文件。 rewind也适用于这种情况 - fseek允许您将读/写指针放在任何位置。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在阅读之前,您忘记了回放文件:

rewind(binaryFile);

答案 3 :(得分:0)

当你完成对文件的写入时,FILE指针就在它的末尾,所以当然如果你尝试阅读它将无效。尝试使用fseek将指针移动到文件的开头,然后再阅读。

请避免这样:

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

并且更喜欢这个:

binaryFile = fopen(binaryFileName, "rb+");
if(!binaryFile) {