先看下面的程序
#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"。