怎样解决使用feof()函数时出现的问题?

feof函数

       昨天在做一个课程设计时,一个函数的功能是将文件中的数据一条条的读到链表中去。既然不确定有多少条数据,那只能借助feof()函数了,本来文件部分就没学好,也就知道这一个方法。但是在测试的后就发现了它的问题,就是在判断是否到达文件尾的时候,它会多读一次,就导致从文件读出的部分内容是错的。可能在课堂上老师就讲到了,可是我不知道当时在干啥哭,反正就是不记得。更关键的是我还不知道如何去解决。然后我就毅然决然的去了百度,新浪博客,CSDN博客,博客园,等搜搜搜!最终发现了相同的一段代码,而且网上对这段代码的评价还挺高。
代码如下:
int c; 

c = fgetc(fp);  
 
while(!feof(fp)) 
 
{
 
  printf("%x\n",c);
 
  c = fgetc(fp);  
} 


可是我粘到我的程序里面后发现并没卵用,依旧出错,一气之下重来,自己解决!最终用了个笨方法,但是毕竟解决了!
下面代码是使用此方法的一个函数:
void readWorkerput ()           //运行前把文件内容读取到电脑内存
{ 
 

	FILE *fp;
    fp=fopen("worker.txt","rb"); //以只读方式打开当前目录下的.txt
    if(fp==NULL)
    {
        printf("无法打开文件\n");
        exit(0);                   //-------- 终止程序 ---------
    }

    int i=0;
  	while(!feof(fp))
	{
		WORK *p=(WORK *)malloc(sizeof(WORK));
        fscanf(fp,"%d %s %s %d %s %f %s %ld",&p->Number,p->Name,&p->Sex,&p->Old,p->Edu,&p->Salary,p->Address,&p->Tel);
		i++;
	}
	fclose(fp); 
	FILE *FP;
    FP=fopen("worker.txt","rb"); //以只读方式打开当前目录下的.txt
    if(FP==NULL)
    {
        printf("无法打开文件\n");
        exit(0);                   //-------- 终止程序 ---------
    }
    int b=i-1;
	int j=1;
	if(i==1)
	{
	fclose(FP);
	}
	else
	{
		while(!feof(FP))
		{
        WORK *n=(WORK *)malloc(sizeof(WORK));
        fscanf(FP,"%d %s %s %d %s %f %s %ld",&n->Number,n->Name,&n->Sex,&n->Old,n->Edu,&n->Salary,n->Address,&n->Tel);
		//printf("%d %s %s %d %s %f %s %ld\n",n->Number,n->Name,n->Sex,n->Old,n->Edu,n->Salary,n->Address,n->Tel);
   		addworker(n);
		n=n->next;
	    if(j==b)
		break;
	    j++;
		}
    fclose(FP);    //----关闭文件-----
	}
}	

可以仔细看看,实在看不懂,我写的整个程序在这     职工信息管理系统      ,打开看看完整的也可以!
### 回答1: 好的,可以尝试使用以下代码: ``` #include <stdio.h> int main() { FILE *fp = fopen("test.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } int c = fgetc(fp); while (c != EOF) { putchar(c); c = fgetc(fp); } fclose(fp); return 0; } ``` 这个代码会在读取每个字符之前检查文件指针是否已经到达文件末尾,如果到达了,那么就不会再读取一次。这样就可以避免 `feof` 函数问题了。 ### 回答2: 在修改代码之前,我们需要先了解为什么会出现feof函数最后读取两次的问题。 feof函数用于判断文件指针是否已经到达文件末尾。当文件指针到达文件末尾,feof函数会返回非零值,否则返回0。由于文件中可能存在换行符或其他不可见字符,在读取完最后一行后,文件指针并未到达文件末尾,而是在文件末尾之后的一个位置。因此,当我们使用feof函数判断文件指针是否到达末尾,会返回0。而当我们再次读取文件,由于文件指针未移动,就会再次读取到最后一行。 为了解决这个问题,我们可以使用其他方法判断文件是否已经读取到末尾,而不依赖于feof函数。 一种解决方法是在读取文件前先获取文件大小,并通过判断文件指针的位置是否与文件大小相等来判断是否已经读取到末尾。如果文件指针的位置与文件大小相等,则表示已经读取到末尾。 另一种解决方法是在读取文件前先读取一行内容,并将文件指针移动到下一行的位置。然后在循环中判断文件指针是否已经到达文件末尾,如果到达末尾则退出循环。 以上是两种解决方法,你可以根据具体的代码和需求选择适合的方法来解决问题。 ### 回答3: 要解决feof函数最后读取两次的问题,可以对代码做出如下修改: 假设原来的代码是这样的: ``` FILE* fp = fopen("file.txt", "r"); if(fp == NULL) { printf("文件打开失败\n"); return 0; } while(!feof(fp)) { char str[100]; fgets(str, 100, fp); printf("%s", str); } fclose(fp); ``` 可以修改为以下形式: ``` FILE* fp = fopen("file.txt", "r"); if(fp == NULL) { printf("文件打开失败\n"); return 0; } char str[100]; while(fgets(str, 100, fp) != NULL) { printf("%s", str); } fclose(fp); ``` 修改后的代码利用fgets函数读取文件中的一行文本,并将其存储在str字符数组中。通过判断fgets函数的返回值是否为NULL,可以确定是否已经读取到文件的末尾。 这样修改之后,就不需要再使用feof函数来判断文件是否结束,从而避免了feof函数在最后一次读取被调用两次的问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值