读文件最后一行数据重复出现解决办法

读文件时,使用feof()判断文件是否结束,使用时发现文件最后的数据会重复出现一次,比较令人费解!

 

源代码:

#include<stdio.h>
#include <stdlib.h>


struct BlockInfo
{
 int index;
 int started;
 int length;
};


void main()
{
  BlockInfo infoContinue;
 FILE* assistFile;
 char* str =  "sqx.txt";
 assistFile = fopen(str,"wb");

 if (assistFile == NULL)
 {
  printf("%s/n","create assist file failed!");
 }
 for (int i = 0 ; i < 2 ;i ++)
 {
  infoContinue.index = i;
  infoContinue.started = i+10;
  infoContinue.length = i*10;
  fwrite(&infoContinue,sizeof(struct BlockInfo),1,assistFile);
 }
 fclose(assistFile);

 FILE* readFile;
 readFile = fopen(str , "r+");
 while(!feof(readFile))
 {
  fread(&infoContinue,sizeof(struct BlockInfo),1,readFile);
   printf("%s%d/n" , "数据块索引 = " , infoContinue.index);
 }
 fclose(readFile);
}

 

输出:

数据块索引 = 0

数据块索引 = 1

数据块索引 = 1(重复输出!!!!!!)

分析:

     1.  最后的数据会重复输出是因为feof在遇到文件结束符EOF这个位置时,返回的还是0,而到下一个位置时才返回1,这时while循环才退出。所以单纯用上面的while循环判断会出现重复的现象。

     2. 使用feof()时,要先读文件然后使用feof()判断文件是否结束。即:

         while(1)

         {

                 fread();

                 if(feof()) break;

         } 


修改后代码:


#include<stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
using namespace std;
struct BlockInfo
{
 int index;
 int started;
 int length;
};
void main()
{
  BlockInfo infoContinue;
 FILE* assistFile;
 char* str =  "sqx.txt";
 assistFile = fopen(str,"wb");

 if (assistFile == NULL)
 {
  printf("%s/n","create assist file failed!");
 }
 for (int i = 0 ; i < 2 ;i ++)
 {
  infoContinue.index = i;
  infoContinue.started = i+10;
  infoContinue.length = i*10;
  fwrite(&infoContinue,sizeof(struct BlockInfo),1,assistFile);
 }
 fclose(assistFile);

 FILE* readFile;
 readFile = fopen(str , "r+");
 while(1)
 {
  fread(&infoContinue,sizeof(struct BlockInfo),1,readFile);
  if (feof(readFile))
  {
   break;
  }

  printf("%s%d/n" , "数据块索引 = " , infoContinue.index);
 }
 fclose(readFile);
}

 

输出:

数据块索引 = 0

数据块索引 = 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值