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

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

  一个文件通常就是磁盘上的一段命名的存储区。比如 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. 【C#】使用Json.NET(newtonsoft)解析Json

    最近做的WPF项目中,需要一个C#下的Json实现. 在Json的官网http://www.json.org/中查找,可见C#的Json工具主要有如下: 尝试了排在最前面的fastJSON,反序列化时 ...

  2. [systemd]How To Use Systemctl to Manage Systemd Services and Units

    转自: https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services ...

  3. http抓包工具

    fiddler 可以用该工具抓包并修改对应的参数数据

  4. iOS边练边学--通知机制和键盘处理小练习

    一.发送通知 NSNotification *note = [NSNotification notificationWithName:@"通知的名称,随便写,例如:你妈叫你回家吃饭" ...

  5. java-基于JavaMail的Java邮件发送

    1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送

  6. ubuntu 12.04 rails server 时候报错 execjs

    新的应用创建好了,使用rails server启动看看,oops!原来是没有javascript运行环境. 1 2 $ rails server  /usr/local/lib/ruby/gems/1 ...

  7. QFTPERROR lists

  8. Python 变量类型和运算符

    -*- coding:utf-8 -*- ''' if语法 if conditon: [tab键] command [tab键] command ... else: [tab键] command [t ...

  9. 电脑的CPU可直接解读的数据机器码

    机器语言(machine language)是一种指令集的体系.这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据. 机器码有时也被称为原生码(Native Code), ...

  10. MJRefresh原理分析

    MJRefresh是流行的下拉刷新控件.前段时间为了修复一个BUG.读了它的源代码.本文总结一下实现的原理 下拉刷新的基本原理 大部分的下拉刷新控件.都是用contentInset实现的.默认情况下. ...