使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含 "b"
使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含 "binary"
使用 python 的 open 打开文件,除了可以使用 C 中的 12 个模式外,还可以使用 "U" 或 "rU"
使用 Qt 库的 QFile 打开文件时,可以指定 QIODevice::Text 或不指定
...
如此种种,看起来是如此的复杂,难怪很多刚接触编程的网友都不相信(或者不想相信):
这一切仅仅是为了一个小小的换行符!
是啊,一个小小的换行符值得如此大动干戈么?
当使用 windows 下弱智的记事本时,会不会遇到:本该换行的地方,它显示一个黑色方块?
当使用高级点的编辑器时,是不是都提供设置换行符的功能?
当使用跨平台的工具 (比如windows下git) ,是不是需要特别注意换行符设置?
...
文本 vs 二进制
哎,等等...
你前面提的C中的"b",C++中的"fstream::binary",Qt的"QFile::Text",我都知道啊:不是区分文本和二进制操作的么?和换行符有什么关系?!
那么我们有必须要看看:
什么是文本文件(Text File)?
所有的文件都是二进制文件(Binary File)
如果一个二进制文件的内容全是可打印的字符和空白字符(空格、Tab、回车、换行等)组成,可称其为文本文件。
换句话说:本来就不存在 文本文件 这个独立类别,文本文件属于二进制文件。
如果这样,为何C、C++等等打开文件是都提供文本和二进制两种模式么?(暂不解释^_^)
考虑一个例子:打开文件(不管后缀名等等),分别写入:
"/x10/x11/x12/x13/x14"
不可见字符
"/x30/x31/x32/x33/x34"
"01234"
而后者由于全部是可打印字符,你可能就会称其为文本文件。
文件 vs 模式