`

fopen 文本文件与二进制文件区别

 
阅读更多
8/11/2010 2:45:53 PM

 今天在写文件的时候发现fwrite的时候多出了一些乱码,最后发现加个b,以二进制的方式打开文件就解决了,google了.... 特记与此
在学习C语言文件操作后,我们都会知道打开文件的函数是fopen,也知道它的第二个参数是 标志字符串。其中,如果字符串中出现'b',则表明是以打开二进制(binary)文件,否则是打开文本文件。
  那么什么是文本文件,什么是二进制文件呢? 可能大多数人都没有仔细考虑过。
  在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。实际上,那些没有规定格式的,由可理解的的ASCII以及其他编码文字组成的文件都是文本文件,如C源程序文件,HTML超文本,XML。除此之外的其他文件都是二进制文件,如Word文件DOC,图象格式文件JPG。
  但是,所谓使用fopen标志打开文本文件与二进制文件的说法并不准确。正确的说法应该是--以文本方式和二进制方式打开文件。因为我们用两种方式都可以任意的文件。
  即使这样,为什么还要区分两种方式呢?
  这是因为这两种方式在读写文件时的操作是不一样的。
  二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的時候,也是把內存缓冲区的內容原封不动的写到文件中。
  而文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。
所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或內容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。
  要特別注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,沒有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。
  如上文已提到,DOS和Windows系统使用CRLF(0x0D 0x0A)双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)为。在C语言中,也是以LF即'/n'为换行符。
  由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF->LF的转换。而Unix的定义和C语言的是一样的,就不必转换了。
  那么,为什么會有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改給众多的C语言开发者添了这样一个小小的麻烦。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76292/showart_2140344.html
注:类似python等函数,用到readline(),只能按文本格式打开,只有文本格式具有回车换行符,可以按行读取。
分享到:
评论

相关推荐

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

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

    读取二进制文件并生成指定图片

    一个是读取图片文件的二进制流,按照规定的格式写入一个txt文本文档中,另一个程序是将此文本文档中的内容按照指定格式复制到代码的数组中,最终可生成原图片。特点:第二个程序不需要单独的图片附件,而是将所需...

    C++文件读写+二进制读写+STL文件函数+创建文件+读指针+写指针+读写指针+可应用于系统中底层的文件创建+计算机专业领域

    word文件记事本打开看是乱码,因此也是二进制文件 文件读写相关函数在头文件 cstdio (或stdio.h)中声明#include  fopen函数打开文件, 返回 FILE * 指针,指向和文件相关的一个FILE变量(FILE 是在cstdio中定义的...

    C语言程序设计题库 第十一章:数据文件的使用

    文件可以分为文本文件和二进制文件两种类型: 文本文件(Text File):文本文件是由字符组成的文件,可以使用文本编辑器打开并查看其内容。文本文件中的数据是以文本形式存储的,例如ASCII码或Unicode编码。C语言中...

    C语言文件输入与输出

    C语言输入输出函数 1.fopen()函数 fopen函数用于打开文件,其调用格式为:FILE*fopen(...对磁盘来说就是文本文件和二进制文件。本软件为了便于让读者易理解TurboC2.0语言而没有对流和文件作特别区分。

    C语言-文件-知识要点.pdf

    文件处理在编程中是一个基础且关键的部分,能够帮助开发者读取、写入和操作各种类型的文件,如文本文件、二进制文件等。以下是对这份资源的概括: 知识要点和内容: 文件基本操作: 学习如何打开、创建、关闭文件...

    C语言文件操作及函数大全

    其意义是打开C驱动器磁盘的根目录下的文件file_a, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。"\\"对于打开磁盘下的文件,要注意两个双斜线...

    13.第十三章 文件.txt

    因此文本文件的读写花费较多的转换时间,对二进制文件的读写不存在这些转换。 (7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。 2.关闭文件(fclose...

    劝退级!C语言全新培训课程 C语言从入门到放弃视频教程 C语言全新视角新思路课程

    ├─102、14-2文本文件与二进制文件.mp4 ├─103、14-3文件的缓冲.mp4 ├─104、14-4FILE与fopen.mp4 ├─105、14-5fclose.mp4 ├─106、14-6一次读写一个文件fgetcfputc.mp4 ├─107、14-7feof的问题和加解密.mp4 ...

    C编码技术-错误与对策

    函数声明中的类型信息 VOLATILE AND和OR的短路行为 位操作符的操作数 ...跨系统传输二进制文件 文本模式和二进制模式 在信号处理函数中只调用异步安全的函数 程序终止时的清理 省略和多余 注意编译器的优化

    C语言文件打开的模式

    1、文件分为ASCII文件和二进制文件,ASCII文件也称文本文件,由一系列字符组成,文件中存储的是每个字符的ASCII码值。 2、FILE *fp; FILE是文件类型标识符,是C编译系统定义好的一个结构体类型,结构体中含有...

    C语言程序设计标准教程

    其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号...

    C语言文件操作大全

    1、文件分为ASCII文件和二进制文件,ASCII文件也称文本文件,由一系列字符组成,文件中存储的是每个字符的ASCII码值。 2、FILE *fp; FILE是文件类型标识符,是C编译系统定义好的一个结构体类型,结构体中含有文件名...

    c语言打开文件函数使用方法

    为输入打开一个文本文件“w”(只写) 为输出打开一个文本文件“a”(追加) 向文件文件尾添加数据“rb”(只读) 为输入打开一个二进制文件“wb”(只写) 为输出打开一个二进制文件“r+”(读写) 为读写打开一个文本文件“w...

    吕鑫:最博大精深的C语言视频教程 第19天 【第2堂课】全面讲解C语言f族函数的功能

    1、讲解fopen函数打开文件时使用文本模式和二进制模式的区别; 2、全面讲解各种C语言f族函数的功能和调用方法;

    C读取txt文件数据,并向其写数据

    程序说明: 实现对账户信息的添删查改操作 从一个文本文件 data.txt 读取数据,然后写入一个二进制文件 credit.bf 文件中

    readascii:读取 ascii 文件并为加载兼容性做好准备。-matlab开发

    输出文件可以保存为二进制,它只保存文件内的数据。 输入变量: argin 是一个带有字段的结构数组: infile = 要读取的文件outfile = 输出文件的名称(仅当给出时) outperm = 用于 fopen.m 的输出文件的权限示例 -...

    网管教程 从入门到精通软件篇.txt

    BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 BUN:CakeWalk 声音...

    CStdioFile的用法详细解析

    流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该...

    C语言讲义.doc

    5.10 通过FWRITE将结构保存到二进制文件中 79 5.11 FSEEK函数 80 5.12 FTELL函数 80 5.13 FFLUSH函数 80 5.14 REMOVE函数 81 5.15 RENAME函数 81 6 基础数据结构与算法 82 6.1 什么是数据结构 82 6.2 什么是算法 82 ...

Global site tag (gtag.js) - Google Analytics