c++ 以二进制和以文本方式读写文件的区别
在c++项目开发中,时常涉及到文件读写操作。因此在这里先简单梳理和回顾一下文本模式和二进制模式在进行文件读写上的区别。
1.linux平台下文本文件和二进制文件的读写
在linux平台下进行文件读写时,文本模式和二进制模式没有区别。在文件读写时,调用fopen,无论以文本模式还是二进制模式打开文件,之后在进行文件读取和写入,其结果都是一样的。因此,在linux平台下,以二进制方式创建的文件和写入的文件,在以后的访问中,使用二进制或者文本方式均可以进行正确的读写;同理,以文本方式创建的文件和写入的文件,使用二进制或者文本模式均可以进行正确的读写。请看一下例子:
1.1 以二进制模式打开并写入文件
//例子1:以二进制模式打开并写入文件
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int m=;
char s[] = "中国\n";
FILE *fp = fopen("testBin.txt","wb"); //二进制模式
if(NULL == fp )
{
return -;
}
int successCont=fwrite(&m,sizeof(int),,fp);
if(successCont!=)
cout<<"error"<<std::endl;
fwrite(s,sizeof(char),sizeof(s),fp);
fprintf(fp,"%d",m); //格式化输出
fclose(fp);
return ; }
查看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"写入。请看以下示例:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int m = ;
char s[] = "中国\n";
FILE *fp = NULL;
fopen_s(&fp,"winTxt.txt", "w");
if (NULL == fp)
{
return -;
}
int successCont = fwrite(&m, sizeof(int), , fp);
if (successCont != )
cout << "error" << std::endl;
fwrite(s, sizeof(char), sizeof(s), fp);
fprintf(fp, "%d", m);
fclose(fp);
return ; }
winTxt.txt结果如下:

对比linux平台可以发现,\n(0x0a)前果然多了一个字符\r(0x0d)。
2.2 以二进制模式打开并写入文件
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。
把2.1节中的第9行代码改为:fopen_s(&fp,"winBin.txt", "wb");运行,查看winBin.txt,结果如下:

因此,在windos平台下开发中,以二进制模式创建并写入的文件,在读取时,为了防止读文件出错,建议以二进制模式进行读取;同样的道理,以文本模式创建并写入的文件,在读取该文件时,建议以文本模式进行读取。
c++ 以二进制和以文本方式读写文件的区别的更多相关文章
- C/C++中二进制与文本方式打开文件的区别
二进制与文本文件主要有两个大的区别: 1.换行符的区别: Windows平台下 对于Windows文本文件,它们使用回车和换行来表示换行符:如果以“文本”方式打开文件,当读取文件的时候,系统会将所有 ...
- C语言中以文本方式读写文件时换行符转换的注意事项
我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...
- 《用格式化(fprintf和fscanf函数)的方式读写文件》
//用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...
- C语言采用文本方式和二进制方式打开文件的区别分析
稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?对于编程人员来说,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制 ...
- Windows读写文件的猫腻
这里主要涉及对于回车换行的讨论. 回车:\r 换行:\n Windows读写文件分为普通文件读写和二进制文件读写. 如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处 ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
[源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...
- 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表
原文:重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表 [源码下载] 重新想象 Windows 8 S ...
随机推荐
- codevs1018 单词接龙
题目描述 Description 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次), ...
- S - Arc of Dream 矩阵快速幂
An Arc of Dream is a curve defined by following function: where a 0 = A0 a i = a i-1*AX+AY b 0 = B0 ...
- M - 小希的迷宫 并查集
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- Ubuntu 16.04安装VLC播放器,替代系统默认播放器
VLC播放器应该说是开源项目中最好的视频播放器,但功能不止于视频播放,还有视频直播等等.可以通过安装字幕插件搜索字母等. 安装步骤: 1.安装: sudo add-apt-repository ppa ...
- Eclipse错误出现:Unable to install breakpoint in... (未能解决)
Unable to install breakpoint in... Eclipse Unable to install breakpoint in 的问题还是没解决 1.重装eclipse无效 2 ...
- MySQL大小写问题的简单说明(关键字/函数/表名)(转)
MySQL语句中字母大小写规则随着语句元素的不同而变化,同时还要取决于MySQL服务器主机上的操作系统. SQL关键字与函数名 关键字和函数名不区分字母的大小写.如.abs.bin.now.versi ...
- 桦仔------分享一下我研究SQLSERVER以来收集的笔记
http://www.cnblogs.com/lyhabc/p/3219117.html
- php apc缓存以及与redis的对比
apc缓存用户数据这个会用, apc_store() 和apc_fetch()函数. 那apc 缓存php 代码,这个怎么用呢? 原文: http://blog.csdn.net/w187046226 ...
- Python3基础(五) 函数
函数(function)是组织好的.可重复使用的.具有一定功能的代码段.函数能提高应用的模块性和代码的重复利用率,Python中已经提供了很多内建函数,比如print(),同时Python还允许用户自 ...
- C#之out和ref区别
out与ref的区别总结:1.两者都是通过引用来传递.2.两者都按地址传递的,使用后都将改变原来参数的数值.3.属性不是变量,因此不能作为 out或ref 参数传递.4.若要使用 ref 或 out, ...