fgets配合feof多读一行与少读一行

多读一行:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	char line[64];
	int i = 0;
	FILE *fp = fopen("aaa.txt", "rb+");
	if(fp)
	{
		while(!feof(fp))
		{
			i++;
			memset(line,0, sizeof(line));
			fgets(line, sizeof(line), fp);
			printf("read line %d\n", i);
		}
		fclose(fp);
	}
}

aaa.txt内容如下:

12345\n
67890\n

打印是:读取了3行

read line 1
read line 2
read line 3

少读一行

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	char line[64];
	int i = 0;
	FILE *fp = fopen("aaa.txt", "rb+");
	if(fp)
	{
		while(1)
		{
			i++;
			memset(line,0, sizeof(line));
			fgets(line, sizeof(line), fp);
			if(feof(fp))break;
			printf("read line %d\n", i);
		}
		fclose(fp);
	}
}

aaa.txt内容如下:

12345\n
67890

打印是:读取了3行

read line 1

涉及知识:

回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return。
换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed。
在不同的操作系统这几个字符表现不同,比如在WIN系统下,这两个字符就是表现的本义;
在UNIX类系统,换行\n就表现为光标下一行并回到行首;
在MAC上,\r就表现为回到本行开头并往下一行,至于ENTER键的定义是与操作系统有关的。

char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时

结论:

多读一行是因为fgets读取第二行后,文件指针停在\n,此时while中用feof判断是没有结束,所以还会去读;
少读一行是因为第二行没有\n,fgets第二行后,文件指针停在文件末尾,此时feof判断已经在结尾了。
feof判断位置还是内容?
所以使用fgets和feof的时候要注意这些细节。
发布了38 篇原创文章 · 获赞 17 · 访问量 4296

猜你喜欢

转载自blog.csdn.net/qq_14877637/article/details/95462304