window下文本文件和二進制文件的理解

繼續使用之前的複製測試程序,來對一個aaa.bmp圖片進行復制

#include <fstream>

using namespace std;


int main(){
fstream in("aaa.bmp",ios::in);
fstream out("bbb.bmp",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;

}


複製之後,看到bbb.bmp生成了。

但是兩者的大小不一樣:aaa.bmp3512個字節。bbb.bmp538個字節。

顯然複製過程中已經通過get()得到了一定的信息,但是在中間的操作過程中因爲不知名的原因,信息沒能正常輸出。

是什麼原因呢?

將aaa.bmp與bbb.bmp分別以二進制文件的形式打開。

通過對比,發現aaa和bbb前面部分都是相同的,但是到中間的某個位置,aaa中的一個十六進制數OA在bbb中被解析成了0D 0A,到bbb末尾的位置從1A開始之後就沒有成功輸出。

原因:

在輸入輸出形式檢測中,若有iso::binary,則以二進制文件形式輸入輸出,若缺省則默認爲文本文件。

從我的程序來看,顯然是以文本文件輸入輸出了。

那麼問題就來了。若用文本文件打開之後,程序自動會將一些串轉換爲符合文本文件形式的串。

如之前討論過的,window自動將\n轉換爲\r\n,即此處的0A自動轉換爲0D 0A。

1A對於文本文件來說被解釋成EOF,則顯然無法完成該圖片的完全複製。


解決方法:採用二進制複製。以二進制形式讀取的話,所有的讀入數據都是按數字對待,不會想文本文件一樣需要ASCII碼解釋。

將代碼改爲:

#include <fstream>
using namespace std;


int main(){
fstream in("aaa.bmp",ios::in|ios::binary);
fstream out("bbb.bmp",ios::out|ios::binary);
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;
}

呵呵,果斷複製成功!

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