近期看到了文本流和二进制流的区别,书上讲的比较含糊,理解不透彻,于是细细琢磨了下,把心得跟大家分享一下:

一、首先回答,什么是文件,流

  一个文件通常就是磁盘上的一段命名的存储区。比如 stdio.h 就是一个包含一些有用信息的文件的名称。

  C将文件看成是连续的字节序列,其中每一个字节都可以单独地读取。这与 UNIX 环境(C的发源地)中的文件结构是一致的。因为其他环境中的文件模型可能会有所不同,所以 ANSI C 提供了文件的两种视图:文本视图和二进制视图。

  C将数据的输入输出看作是数据的流入和流出,不管是磁盘文件或者是物理设备都可看作一种流的源和目的,视他们为同一种东西,而不管其具体的物理 结构,即对他们的操作,就是数据的流入和流出。这种把数据的输入输出操作对象,抽象化为一 种流,而不管它的具体结构的方法很有利于编程,而涉及流的输出操作函数可用于各种对象,与其具体的实体无关,即具有通用性。
  

二、文本视图和二进制视图区别

  二进制视图中每个字节都可以为程序所访问。

  在文本视图中,程序看到的内容和文件的内容有可能不同(非 UNIX 环境)。举例,DOS下有个文件 test.txt,内容为

hello\r\n
world\r\n
^Z

当以二进制模式打开 test.txt 时,C程序看到的内容跟原来一样(如下),此时,没有任何映射发生。

hello\r\n
world\r\n
^Z

当以文本模式打开 test.txt 时,C程序看到的是如下内容:(注意行尾和文件结束符)

hello\n
world\n

也就是说使用文本视图读取文件时,将把行尾的本地环境表示法映射为 C 视图;在输出的时候,也会将 C 视图中的行尾表示映射为本地环境表示法。这样,C 通过文本视图巧妙的将不同环境(DOS,MAC)下的文件转换为相同的表示(UNIX下的表示法)。

而二进制视图则与原文件没有丝毫变化!有点理解了吧?

三、文本文件与二进制文件

  文本文件是基于字符编码的文件,基本是定长的,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,变长编码,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。

 文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流,然后按照你所选择的解码方式来解释这个流,最后将
解释结果显示出来。当用记事本打开二进制文件时,由于按既定的字符编码工作(如ASCII码),所以出现乱码也是很必然的一件事情了。

  文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的
译码方式)。 文本文件的可读性要好些,存储要花费转换时间(读写要编译码),而二进制文件可读性差(需要具体的文件解码器),存储不存在转换时间(读写
不要编解码,直接写值)。

  你懂了吗?

Stay hungry
Stay foolish

C语言中的文本流与二进制流的区别的更多相关文章

  1. (二)C语言文本流和二进制流的区别

    转至:http://www.cnblogs.com/xiangzi888/archive/2011/11/10/2244336.html 一.首先回答,什么是文件,流 一个文件通常就是磁盘上的一段命名 ...

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

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

  3. C语言中的单引号和双引号的区别

    首先肯定地说,二者是有区别的,不是说用谁都一样. 1.实质区别,代表的含义不同 'A'代表的是一个整数,而且这个整数对应的是编译器所采用的字符集中的字符序列对应的数值.所以'A'跟ASCII中的65意 ...

  4. C语言中头文件尖括号和引号的区别

    用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...

  5. C#图片转换成二进制流并且保存到sql server数据库

    注意:我要存储文件二进制流的列的类型是text,不是image类型. 我已经实现了从数据库中读取text类型的二进制流,,现在就是不知道怎么存进去. 我的部分关键代码: StreamReader sr ...

  6. [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

    [.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...

  7. python django中使用sqlite3数据库 存储二进制数据ByteArray

    在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...

  8. 文件操作总结:关于文本和二进制流(typeText&typeBinary)

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 总结: CFile,其自身是不提供缓冲区的(?但CFile又有一个Flush,这一点目 ...

  9. C语言中字符串如何转换为二进制、八进制、十进制、十六进制

    在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, st ...

随机推荐

  1. 深入学习RabbitMQ(四):channel的confirm模式

    转自:http://m.blog.csdn.net/article/details?id=54340711 上一篇博客我们介绍了使用RabbitMQ可能会遇到的一个问题,即生产者不知道消息是否真正到达 ...

  2. 在shell 中字符串,文件,数字的比较

    hadoop fs -test -e /path/exist ] ;then echo 'exist' else echo 'Error! path is not exist' fi 在shell中如 ...

  3. Energy Modes能量管理模式

    1  EM0 运行模式 默认模式; 2  EM1 休眠模式 休眠模式 主处理器停止,片上系统模块运行; 3  EM2 深度休眠 只有异步或低频外设运行; 4  EM3 停止模式 与EM2相比,低频晶振 ...

  4. Android——适配器其他组件(AutoCompleteTextView:自动完成文本编辑框;Spinner:下拉列表)

    activity_activitywenben.xml <?xml version="1.0" encoding="utf-8"?> <Lin ...

  5. 树莓派Raspberry命令行配置无线网络连接

    前言: 树莓派有多种联网的方式,通过有线网或者通过无线网.通过有线网连接是比较简单的,在开启dhcp的路由器下,直接插上网线就可以联网,本文介绍树莓派无线联网的方式.再没联网的情况下,如果没有屏幕等外 ...

  6. Yii 中Criteria常用方法

    $criteria = new CDbCriteria; //select $criteria->select = '*';//默认* $criteria->select = 'id,na ...

  7. PHP打印重复的东西

    <?php echo str_repeat(" ", 8)?>//连续打印8个空格

  8. 用Jquery获取checkbox多个选项

    1,下拉框: var cc1   = $(".formc select[@name='country'] option[@selected]").text(); //得到下拉菜单的 ...

  9. solr学习2

    1:solr中的时间问题 solr中显示的时间默认会比我们本机时间少八个小时,因为时区不一样. 在solr的web页面查看会发现时间少八个小时. 但是使用java代码操作的时候是整成的的,所以在这只需 ...

  10. Hbase导入MapReduce数据的时候提示Running Job XXXX后就一直卡着不动

    代码确信无误之后,ant运行起来,发现一执行就卡在Running Job XXXX那里一直不动了. 试着把代码打包成jar扔到Linux执行也还是一样的效果.还是停在那里.然后就一顿瞎蒙.最后发现是H ...