c++ 以二进制和以文本方式读写文件的区别
2018-06-18 04:06:11来源:未知 阅读 ()
在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平台下开发中,以二进制模式创建并写入的文件,在读取时,为了防止读文件出错,建议以二进制模式进行读取;同样的道理,以文本模式创建并写入的文件,在读取该文件时,建议以文本模式进行读取。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash