所謂二進制文件和文本文件對於字母而言沒有什么不同,都是存儲該字母的ASCII碼值。能引起不同的是數字和一些排版用符號的格式。
- 數字在二進制文件中會存儲該數字的值,而文本文件中則首先將該數字視為字符量,並按照ASCII碼表轉換為新的數字再存儲;
- 排版符號的一個例子是換行符,二進制文件只是一個換行符,文本文件中則是換行符加上回車符;
所以簡單的區分方法是文本文件對每個字符都要做ASCII轉換,而二進制文件只會對字母做必要的ASCII轉換,對數字則是直接存儲的。
下來我們來討論如何真正的實現二進制文件的建立:
並不是我們所認為的在打開文件時設定ios::binary就可以,還要注意輸出的函數:
- 在使用<<輸出時,實際上都會轉換為文本文件輸出。即如果輸出一個數字,先是轉換為相應ASCII碼值作為字符串存儲。用這種方法輸出二進制文件的方法就是欺騙電腦——把double,int等數組強制轉換為char型數組。注意不能是單個變量,因為double一個是4字節,char是1個字節,數組轉換的同時數組大小也變化使得數據不丟失,但變量在強制轉換的過程中一定會損失數據。當直接轉換為char,實際上未經過轉化,而且輸出char型變量時,也不會進行轉化;這樣就欺騙了<<操作符,讓我們可以以char的形式輸出一個數,而不用ASCII轉換。實際代碼如下:
ofstream file("E:/BaiduYunDownload/data.txt" ,ios_base::binary|ios_base::trunc);
double a[4]={16.7,2.4,42.3,56.7};
int i;
if(!file.good())
{
printf("Cannot open the file\n" );
return 0;
}
for(i=0;i<sizeof (a);i++){
file<<((char *)a)[i];
}
- 另外一種方法是write函數,理論是一樣的,都是依靠強制轉換為char型變量以避免ASCII轉換