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的時候要注意這些細節。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章