在c++項目開發中,時常涉及到文件讀寫操作。因此在這里先簡單梳理和回顧一下文本模式和二進制模式在進行文件讀寫上的區別。
1.linux平台下文本文件和二進制文件的讀寫
在linux平台下進行文件讀寫時,文本模式和二進制模式沒有區別。在文件讀寫時,調用fopen,無論以文本模式還是二進制模式打開文件,之后在進行文件讀取和寫入,其結果都是一樣的。因此,在linux平台下,以二進制方式創建的文件和寫入的文件,在以后的訪問中,使用二進制或者文本方式均可以進行正確的讀寫;同理,以文本方式創建的文件和寫入的文件,使用二進制或者文本模式均可以進行正確的讀寫。請看一下例子:
1.1 以二進制模式打開並寫入文件
1 //例子1:以二進制模式打開並寫入文件 2 #include <stdio.h> 3 #include <iostream> 4 using namespace std; 5 int main() 6 { 7 int m=97; 8 char s[] = "中國\n"; 9 FILE *fp = fopen("testBin.txt","wb"); //二進制模式 10 if(NULL == fp ) 11 { 12 return -1; 13 } 14 int successCont=fwrite(&m,sizeof(int),1,fp); 15 if(successCont!=1) 16 cout<<"error"<<std::endl; 17 fwrite(s,sizeof(char),sizeof(s),fp); 18 fprintf(fp,"%d",m); //格式化輸出 19 fclose(fp); 20 return 1; 21 22 }
查看testBin.txt的數據,如下:
其中: 0061 0000為m的值97(我的計算機是小端序,文件的默認編碼是utf-8), b8e4 e5ad bd9b為漢字中國對應的utf-8編碼,0a為\n字符,3739 為字符7和9對應的ASCII值。
1.2 以文本模式打開並寫入文件
修改1.1節中的第9行代碼為FILE *fp = fopen("testTxt.txt","w"); //文本模式。然后重新運行程序,查看testTxt.txt文件,結果如下:
可以發現,以文本模式打開並寫入文件的結果和通過二進制模式寫入文件的結果一致。
2.windows平台下文本文件和二進制文件的讀寫
下面,簡單對比一下windows平台上以文本模式和二進制模式進行文件讀寫的差異。
2.1 以文本模式打開並寫入文件
如果以“文本”方式打開文件,當讀取文件的時候,系統會將所有的"/r/n"轉換成"/n";當寫入文件的時候,系統會將"/n"轉換成"/r/n"寫入。請看以下示例:
1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 int main() 5 { 6 int m = 97; 7 char s[] = "中國\n"; 8 FILE *fp = NULL; 9 fopen_s(&fp,"winTxt.txt", "w"); 10 if (NULL == fp) 11 { 12 return -1; 13 } 14 int successCont = fwrite(&m, sizeof(int), 1, fp); 15 if (successCont != 1) 16 cout << "error" << std::endl; 17 fwrite(s, sizeof(char), sizeof(s), fp); 18 fprintf(fp, "%d", m); 19 fclose(fp); 20 return 1; 21 22 }
winTxt.txt結果如下:
對比linux平台可以發現,\n(0x0a)前果然多了一個字符\r(0x0d)。
2.2 以二進制模式打開並寫入文件
如果以"二進制"方式打開文件,則讀/寫都不會進行這樣的轉換。
把2.1節中的第9行代碼改為:fopen_s(&fp,"winBin.txt", "wb");運行,查看winBin.txt,結果如下:
因此,在windos平台下開發中,以二進制模式創建並寫入的文件,在讀取時,為了防止讀文件出錯,建議以二進制模式進行讀取;同樣的道理,以文本模式創建並寫入的文件,在讀取該文件時,建議以文本模式進行讀取。