在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++ 以二进制和以文本方式读写文件的区别的更多相关文章

  1. C/C++中二进制与文本方式打开文件的区别

    二进制与文本文件主要有两个大的区别: 1.换行符的区别: Windows平台下  对于Windows文本文件,它们使用回车和换行来表示换行符:如果以“文本”方式打开文件,当读取文件的时候,系统会将所有 ...

  2. C语言中以文本方式读写文件时换行符转换的注意事项

    我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...

  3. 《用格式化(fprintf和fscanf函数)的方式读写文件》

    //用格式化(fprintf和fscanf函数)的方式读写文件 [用格式化的方式向文件中写入数据]#include<stdio.h>#include<stdlib.h> int ...

  4. C语言采用文本方式和二进制方式打开文件的区别分析

    稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?对于编程人员来说,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制 ...

  5. Windows读写文件的猫腻

    这里主要涉及对于回车换行的讨论. 回车:\r 换行:\n Windows读写文件分为普通文件读写和二进制文件读写. 如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处 ...

  6. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  7. Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据

    [源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...

  9. 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表

    原文:重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表 [源码下载] 重新想象 Windows 8 S ...

随机推荐

  1. Docker website

    https://github.com/docker/labs/  (nguo123gmail  Cooooos123!) Docker Tutorials and Labs At this time ...

  2. ORACLE分区表删除分区数据

    --全删除 ALTER TABLE tableName DROP PARTITION partionName UPDATE GLOBAL INDEXES; --清数据 ALTER TABLE tabl ...

  3. Ubuntu中LightDM是什么(转)

    LightDM(Light Display Manager)是一个全新的轻量级Linux桌面显示管理器,而传统的Ubuntu是使用GNOME桌面标准的GDM. LightDM是一个跨桌面显示管理器,其 ...

  4. 中间件解析FDMEMTABLE.delta生成SQL的方法

    遍历Delta.DataView.Rows,Delta.DataView.Rows是记录的行集,由行组成 TFDDatSRow,即是一行记录的对象 TFDDatSRow的方法:  GetData(), ...

  5. Android之设置拖拽监听

    以EditText为例: username.setOnDragListener(new OnDragListener() { @Overridepublic boolean onDrag(View v ...

  6. 1. MaxCounters 计数器 Calculate the values of counters after applying all alternating operations: increase counter by 1; set value of all counters to current maximum.

    package com.code; import java.util.Arrays; public class Test04_4 { public static int[] solution(int ...

  7. smart pointer

    smart pointer是一种abstract data type,它可以模仿指针的行为,而且额外提供了一系列诸如自己主动内存管理.边界检查等特性,这些特性是为了在保证效率的基础上降低因为对指针的不 ...

  8. unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发

    解说文件夹 第一讲  游戏介绍和资源简单介绍 第二讲  游戏场景背景的搭建 第三讲  游戏特效预制体的制作 第四讲  游戏场景前景的显示 第五讲  瓷砖背景块 第六讲  方块的消除 第七讲  方块的交 ...

  9. 【NYOJ42】一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 Position:http://acm.nyist.net/JudgeOnline/problem.php?pid= ...

  10. P3567 [POI2014]KUR-Couriers 主席树

    这个题比一般主席树还要简单,但是用来练习主席树再好不过了,在这里我再放一下主席树板子. 代码: #include<iostream> #include<cstdio> #inc ...