多读一行:
#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的时候要注意这些细节。