前一段時間在使用 getline() 按行讀取整個文件時遇到了一個很奇怪的問題——文件的最后一行會被讀取多次。百思不得其解,后來上網查了很久才發現原來是用於檢測文件結尾的 eof() 的問題。eof() 報告最近讀取的結果,也就是說,它們在事后報告,而不是預先報告,因此應將eof() 測試放在讀取之后。
eof() 函數的功能是:判定是否已經讀到文件的結尾,如果到文件結尾,該函數返回值為1,否則返回為0。事實上,文件本身是沒有文件結束符EOF的。當讀取文件中最后一個有效字符后,雖然文件指針已指向空白了,但這時還不知道是否到了文件末尾,只有再讀取一次文件,待讀不到任何內容了,這時輸入流設置eofbit位,eof的返回值才為l,而空的內容是不會被提取到變量的,故最后一次讀到變量中的內容又被重復輸出了。
所以解決這個問題的方法就是先讀取,然后判斷文件是否為空,如果不為空則輸出,即代碼如下:
1 ifstream fin(inputname); 2 ofstream fout(outputname); 3 string str; 4 fin>>str; 5 while(!fin.eof()) 6 { 7 fout<<str<<endl; 8 fin>>str; 9 }