一個測試程序: 一個簡單的複製文件程序
#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字節。