ASCII文件也称为text文件,每一个字节存放一个ascii代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘文件存放。如一个整数10000 ,在内存中占2个字节,如果按ascii形式输出,则占5个字节分别存放字符1,0,0,0,0,而按二进制形式输出则占2个字节,用ascii形式与字符一一对应,便于对字符处理,输出字符,但占存储空间较大,而且要花费转换时间(二进制形式与ascii码形式之间的转换)
文件结束标志符:EOF(-1),对于文本文件,当读入的字符为EOF时,就表明读入的不是正常的字符而是文件结束符。由于ANSI C允许用缓冲文件系统处理二进制文件,对于二进制文件,读入的字符有可能是-1,而这又是EOF的值,这就出现了读入有用字符而被处理为文件结束的情况。为了解决这个情况,ANSI C提供了一个feof(fp)来判断文件是否真的结束,用feof(fp)来测试fp所指向的文件当前状态是否“文件结束”,是,函数feof(fp)返回1(真),否,返回0(假)
ASCII文件包含text文件和binary文件,只要这些文件的编码是ASCII字符集的。与binary文件相对的概念叫做“text文件”!
关于下面这个问题:
在unix,linux等类unix下无TEXT BINARY之分。
因为含义可见文件的行结束是一个0x0a.
其他系统下必须区分。fopen时要指定是ascii或binary.以便文件读入,输出是进行必要的格式转换
fopen的时候不指定ascii,Windows下的"rb","rt"恰恰对应的是birany和text。
如果你说不知道什么是"rt"?rt=r,查一下MSC/TC的文档。VC的我没查过,不知道还有没有"rt"之说。
网友的回答:
(1)
以下的"文本文件"==text file "二进制文件"==binary file
第一,ascii文件!=文本文件.文本文件是可打印的字符加上控制字符.
第二,不同的平台使用的打印字符集可能不同,控制字符也可能不同
第三,ascii标准并不能约束文本文件.
第三,不同平台上的文本文件的不同在于控制字符的不同
第四,对同于一个平台在系统级别或者说系统调用级别上来说没有文本文件和二进制文件的区别.
第五,文本文件是C语言标准库为统一各个平台上控制字符和应付以后的发展提出的概念.
所以flw所谓的相同,在C语言标准I/O库层次上看是对的,站在系统调用的角度看,就是错的.所以总起来说是错的
系统向打印机,终端,控制台等写文本时候,驱动程序依据控制字符来驱动设备.你的文本文件要输出一定的格式你就必需向文件中写入控制字符.由于在不同的平台上控制字符不同的可能性和事实上的存在,C语言标准IO库才会弄出个text file来,这样只用一套控制字符就可以了.这样做的目的是IO库屏蔽掉平台之间的差异,C程序具有可移植性.
但C语言IO库这套控制字符从哪里来呢?他的控制字符是ascii标准吗?不是.拿'/n'来说,它在ascii标准中只是起换行作用的.但IO库把它作为/r/n.这足以说明这个控制字符不是ascii标准的.
(2)
我引用一个文件的定义:
[quote]
A file stored in binary format. A binary file is computer -readable but not human-readable. All executable programs are stored in binary files, as are most numeric data files. In contrast, text files are stored in a form (usually ASCII) that is human-readable.
我再引用一个
(3) 你能认识到所有的数据,只不过是“二进制流”,这很好,说明你已经能够“透过现象看本质”了,可是,看明白“本质”以后,难道就不管“现象”了? |
(4)
所有的文件都是二进制文件,
文本文件只不过是二进制文件一个子集而已
简单的说,明白的人,啥时候都不会在这个文件操作上翻跟头。
其实就是,一个二进制流。你愿意原封不动的看,那就是二进制文件。你愿意去在意特定的“行”的概念,以及行和行之间的标志(各个系统之间不同),那就是文本文件
(5)
无论任何文件,都是由一个个字节组成的,不管是在存储介质上存储,还是在网络中传输。我们通常意义上的文本文件,实际上是只包含可见字符(和回车换行等控制字符)的文件。而ascii的严格定义是:
ASCII is the American Standard Code for Information Inter-
change. It is a 7-bit code. Many 8-bit codes (such as ISO
8859-1, the Linux default character set) contain ASCII as
their lower half.
0x00也是ASCII码之一;但包含0x00的文件我们绝对不能称之为文本文件。在ftp中的asii方式与binary 实际上只是借用了一下定义而已,ascii方式在不同字符集间有转换,如EBCDIC->;ascii,unix like text ->;win like text,而binary方式不作任何转换。
(6)
二进制与文本方式的区别不是这样看的,两者的主要区别,是文本方式允许在输入或输出时,对某些字符进行替换、增加或删除等操作。在windows下,主要的区别就是写入时/n会被替换为/r/n,输出时/r/n又会被重新组合为/n。请看C89/C99关于两种方式的规定:
A text stream is an ordered sequence of characters composed into lines, each line
consisting of zero or more characters plus a terminating new-line character. Whether the last line requires a terminating new-line character is implementation-defined. Characters may have to be added, altered, or deleted on input and output to conform to differing conventions for representing text in the host environment. Thus, there need not be a one to-one correspondence between the characters in a stream and those in the external representation.
A binary stream is an ordered sequence of characters that can transparently record
internal data. Data read in from a binary stream shall compare equal to the data that were earlier written out to that stream, under the same implementation. Such a stream may, however, hav e an implementation-defined number of null characters appended to the end of the stream.
(7)
ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。
二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。
(8)二进制文件不对写入或读出的文件做格式转换,
QTextStream takes care of converting the 8-bit data stored on disk into a 16-bit Unicode QString