C语言读取文本文件最后一行重复读取问题

0x00 问题

C代码如下:

#include 
#include 

void main(void)
{
        FILE *fp = NULL;
        fp = fopen("test.txt","r");
        if(fp==NULL)
        {
                printf("文件不存在\n");
                exit;
        }
        char str[30]={'\0'};
    
        while(!feof(fp))
        {
                fscanf(fp,"%s",str);
                printf("%s\n",str);
        }
        fclose(fp);
}

文本文件中的内容如下:

a
b
c

程序的读取结果如下,最后一行出现重复读取问题:

a
b
c
c

0x01 问题解决办法

需要遵循先读取再判断文件是否结束的原则。
在C语言中,feof()函数的使用是根据指针内容判断的,而非指针位置,无论指针是否到头,甚至超出了,它都需要先读取指针的内容,看一看内容是否是EOF,然后才知道文件是否到头。上述代码中第四次循环遇到EOF时不能读入有效字符,就会重复输出最后一个字符。
故将代码修改为如下形式:

#include 
#include 

void main(void)
{
	FILE *fp = NULL;
	fp = fopen("test.txt","r");
	if(fp==NULL)
	{
		printf("文件不存在\n");
		exit;
	}
	char str[30]={'\0'};
	
	fscanf(fp,"%s",str);
	while(!feof(fp))
	{
		printf("%s\n",str);
		fscanf(fp,"%s",str);
	}
	fclose(fp);
}

你可能感兴趣的:(四书五经)