从二进制文件

时间:2017-04-12 05:14:02

标签: c file loops while-loop binary

您好我在尝试从文件中写入和读取整数数组,但是,我用来读取它们的循环是一个无限循环。我如何修复这个无限循环,以便当它到达文件末尾时它退出循环。此外,我不完全确定fread是否正在按照我的预期行事。

 FILE *fptr = fopen("number.db", "wb");
 int nums[100] = {1,2,3,4,5,6,7,8,9,100,101,102,103,104,105};
 int nums2[100];

 fwrite(nums,sizeof(int),15,fptr);
 fclose(fptr);

 fptr = fopen("number.db", "rb");
  fseek(fptr,0,SEEK_END);
  long end = ftell(fptr); //finds length of the file
  fseek(fptr,0,SEEK_SET);

 while(!feof(fptr)){
   int counter = 0;
   fread(nums2,sizeof(int),1,fptr);
   fseek(fptr,counter,SEEK_SET);
   counter++;
   if(counter>=end){ //Breaks when it seeks to the end
      break;
    }
 fclose(fptr);

我觉得有一些与恐惧的逻辑有关,但我不太确定。当我打印出“nums2”中保存的数字时,它只读取最后一个数字:所有nums2元素都为105.

1 个答案:

答案 0 :(得分:0)

问题在于搜索/计数器初始化的组合。

如果您每次将计数器设置为0(第一个记录)并且您寻找它,您将始终处于"有效范围"在文件记录中。文件结束条件永远不会发生,因此,while外观将进入无限循环

我确实相信if条件" if(counter> = end)"也没用,我会把它删除。 while循环将完成一次eof,这是应该的方式。

 FILE *fptr = fopen("number.db", "wb");
 int nums[100] = {1,2,3,4,5,6,7,8,9,100,101,102,103,104,105};
 int nums2[100];

 fwrite(nums,sizeof(int),15,fptr);
 fclose(fptr);

 fptr = fopen("number.db", "rb");
 fseek(fptr,0,SEEK_END);
 long end = ftell(fptr); //finds length of the file
 fseek(fptr,0,SEEK_SET);
 int counter = 0;
 while(!feof(fptr)){
      fread(nums2,sizeof(int),1,fptr);
      fseek(fptr,counter,SEEK_SET);
      counter++;
      if(counter>=end){ //Breaks when it seeks to the end
           break;
      }
 }
 fclose(fptr);