在程序再次运行之前,二进制文件的C fread()将无法读取

时间:2017-03-10 06:06:32

标签: c fork fopen fwrite fread

我在使用C语言。 我的程序从用户获取输入,将其发送到子进程,并且子进程将这些数字写入二进制文件。我这样打开文件:

FILE *tallyFileW;  
  // open a stream for writing and one for reading
  tallyFileW=fopen("Numbers.bin","ab+"); // to write
  if(!tallyFileW){
    perror("Unable to Open Writing File!");
    return(1);
  }
  else
    perror("File opened to write numbers\n");
这很顺利;我的二进制文件包含我输入的所有数字。这就是我输入它们的方式:

void writeNumsToFile(FILE *tallySheet, double aNumber, double aNother)
{
  char twoNumbers[512];
  snprintf(twoNumbers,512,"%lf %lf\n",aNumber,aNother);
  fwrite(twoNumbers,512,1,tallySheet);
}

当我去阅读这些数字时,我的麻烦就开始了:

void getAllNumbers(int fileDesc)
{
  int index,wasRead;
  char numSet[512];
  FILE *getNumbers=fopen("Numbers.bin","rb");

  if(!getNumbers){
    perror("Unable to Open Reading File!");
  }
  else
    perror("File opened to read numbers\n");
  while(fread(&numSet,512,1,getNumbers)==1){
    write(1,numSet,strlen(numSet));
  }
  fclose(getNumbers);
}

当我在输入任意数量的数字后立即尝试时,除了(如下所述)是否在程序已经运行之后我什么也得不到。打开此文件以追加。如果这是我第一次运行该程序,则不会打印任何内容。

please enter your input ---> e
you entered e
Hey, it was fun! See ya later.
File opened to read numbers
: Success
-bash-4.1$ emacs Numbers.bin

这是我的G'bye对话,然后没有数字。但是当我再次运行程序时,立即退出...

please enter your input ---> you entered e
Hey, it was fun! See ya later.
File opened to read numbers
: Success
11.000000 22.000000
33.000000 44.000000
55.000000 66.000000
77.000000 88.000000

-bash-4.1$ rm Numbers.bin

我错过了什么?我试过fseek(),但它没有奏效。我也写了没有换行符的数字,但这没有帮助。

1 个答案:

答案 0 :(得分:0)

所以我的代码,这导致了问题:

if(toupper(buf[0]) == 69){ // its over
  getAllNumbers(fileDesc);
  fclose(tallyFileW);
  close(cli2SirvR);
  close(1);
}

我发现的解决方案:

if(toupper(buf[0]) == 69){ // its over
  fclose(tallyFileW);
  getAllNumbers(fileDesc);
  close(cli2SirvR);
  close(1);
}
你能发现差异吗?在我试图阅读之后,我一直在关闭我的写文件指针。一旦我把写文件移到我尝试阅读之前,我的所有问题都消失了。谢谢你的帮助。