fstream中eof的機制

一個測試程序: 一個簡單的複製文件程序

#include <fstream>
using namespace std;


int main(){
fstream in("aaa.txt",ios::in);
fstream out("bbb.txt",ios::out);
if(!in)//判斷打開是否成功
return 0;
while(!in.eof()){
char ch=in.get();
out.put(ch);
}
return 0;
}


aaa內容abc,3字節

輸出bbb後內容爲abc (空字符,不爲空格),4字節

查看16進制文件:

aaa中內容爲:61 62 63,顯然是abc三個字符對應的ascii碼的十六進制形式

bbb中內容爲:61 62 63 FF,看來最後一個字符應該就是這個FF了

爲什麼變成4字節了呢?

我們可以想想eof讀取磁盤的機制。如果說在eof()中也需要讀取磁盤,那麼加上get()中讀取磁盤,會導致讀取磁盤的次數是實際讀取到的內容的兩倍,對於內容很多的文檔是相當大的浪費。

顯然C++在設計fstream類時考慮到了效率的問題,因此在eof()中實際上是不進行磁盤讀取的,只是根據類中eofbit的值,來返回eof()的值,而eofbit會在讀取到第一個不正常字符的時候賦值爲1。

那麼顯然對於上面的測試程序,在讀到最後一個字符時,實際並沒有讀到不正常字符,那麼eofbit的 值自然是0,就不會跳出循環,就會繼續讀一個不正常字符,那樣自然就會多出FF了。

如果要讓最後這個字符不顯示,那麼需要的過程爲:

1.ch=in.get();

2.判斷是否eof();

3.put(ch);


於是將測試程序改爲:

#include <fstream>
using namespace std;


int main(){
fstream in("aaa.txt",ios::in);
fstream out("bbb.txt",ios::out);
if(!in)//判斷打開是否成功
return 0;
char ch;
int i=0;
do{
if(i==1)
out.put(ch);
else
i++;
ch=in.get();
}
while(!in.eof());
return 0;
}

成功完全複製爲3字節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章