while(!in.eof())
{
temp = in.get();
cout<<int(temp)<<endl;
count++;
}
這個時候,會發現在輸出count之前輸出的最後壹個是-1.
但是為什麽會輸出-1(也就是文件結束符號)呢?in.eof()返回的是in裏面的EOF變量,這個變量在in讀到文件的結束符時才會變為1。也就是說,只有當in.get()讀過了eof的時候,in中的EOF變量才會編程1,in.get()才能返回1。
那為什麽按照樓主給的代碼裏面的in>>temp寫法,最後會輸出兩個c,而和get的輸出不壹樣呢?這個是因為>>在處理的時候,如果碰到讀入的是文件結束符,是不會將其寫道緩存中的,那樣的話,緩存中的字符串還是在讀入eof之前的那個字符(這個代碼裏面也就是'c'),然後再賦值給temp的還是'c'了。
那如何可以比較完美的修改上面的代碼呢?對於文件輸入流來說,有壹個指針指向的是當前讀的字符串的下壹位,每讀壹位,指針就往下移壹位。就比如壹個只有abc的input.txt的文件,我們現在讀完了c,那麽指針的狀態是大致是下面這個樣子:
a
b
c
EOF <--
註意,這個時候,in.eof()還不返回1,因為in這個輸入流還沒有讀EOF這個文件結束符,但是in有壹個函數peek()是讀當前指針指向的這個位置的符號的。那麽如果用in.peek() == EOF 來最為判斷的標準就比較好了。樓主的例子寫成
while(in.peek() != EOF)
{
in>>temp;
cout<<temp<<endl;
count++;
}
就可以了。
順便說壹句,第壹段代碼裏面while的裏面再嵌壹個while沒有必要吧...
還有,無論讀還是寫,最好都要養成在操作完畢調用close()關閉流的好習慣:)