多讀一行:
#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的時候要注意這些細節。