文件結束符 End Of File

先看下面的程序

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
	ofstream outfile("test.txt");
	outfile<<"abcdefg";
	outfile.close();

	char c;
	ifstream infile("test.txt");
	while(!infile.eof())
	{
		infile>>c;
		cout<<c;
	}
	system("pause");
	return NULL;
}

其輸出是" abcdefgg ",可以發現輸出了兩個“ g ”,這是什麼原因呢?

1、文件指針

當打開一個文件時,對文件輸入流來說,指針指向的是當前讀取字符串的下一位,每讀一位,指針就往下移一位。

2、關於EOF

大家通常誤認爲文件結束符EOF是從文件讀取的一個字符,其實不然,EOF被定義爲int型的一個負數(比如-1)。EOF也不是文件中實際存在的內容,而是文件流的狀態標誌。在C++中,當讀取文件失敗才產生EOF,所以當輸出第一“ g ”時,產生EOF,輸出第二個“ g ”時,讀取到EOF,循環結束。

3、解決方案

將判斷循環結束的方式改爲“ infile.peek() != EOF ”。
infile.peek() 其返回值是一個char型的字符,其返回值是指針指向的當前字符,但它只是觀測,指針仍停留在當前位置,並不後移。


修改程序如下: 其輸出結果是”abcdefg“

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
	ofstream outfile("test.txt");
	outfile<<"abcdefg";
	outfile.close();

	char c;
	ifstream infile("test.txt");
	while(infile.peek() != EOF)
	{
		infile>>c;
		cout<<c;
	}
	system("pause");
	return NULL;
}
注:程序修改之後,若輸入字符串最後有一個空格符或換行符,則輸出結果是"abcdefgg",因爲輸出"g"時,文件還沒有結束(還有一個空格符或換行符),而peek()函數不會刪除之前緩存區裏的字符"g",所以循環繼續,輸出的還是"g"。






發佈了27 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章