c++ 以二进制和以文本方式读写文件的区别
在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平台下开发中,以二进制模式创建并写入的文件,在读取时,为了防止读文件出错,建议以二进制模式进行读取;同样的道理,以文本模式创建并写入的文件,在读取该文件时,建议以文本模式进行读取。