在学习了 C++ 文件流对象使用 open() 打开文件后,我们知道它的第二个参数是一个字符串,用来表示文件打开方式,即如果使用 ios::binary,则表示以二进制方式打开文件;反之,则以文本文件的方式打开文件。
根据我们以往的经验,文本文件通常用来保存肉眼可见的字符,比如 .txt文件、.c文件、.dat文件等,用文本编辑器打开这些文件,我们能够顺利看懂文件的内容。
二进制文件通常用来保存视频、图片、程序等不可阅读的内容,用文本编辑器打开这些文件,会看到一堆乱码,根本看不懂。
但是从物理上讲,二进制文件和字符文件并没有什么区别,它们都是以二进制的形式保存在磁盘上的数据。
我们之所以能看懂文本文件的内容,是因为文本文件中采用的是 ASCII、UTF-8、GBK 等字符编码,文本编辑器可以识别出这些编码格式,并将编码值转换成字符展示出来。
而二进制文件使用的是 mp4、gif、exe 等特殊编码格式,文本编辑器并不认识这些编码格式,只能按照字符编码格式胡乱解析,所以就成了一堆乱七八糟的字符,有的甚至都没见过。
如果我们新建一个 mp4 文件,给它写入一串字符,然后再用文本编辑器打开,你一样可以读得懂,有兴趣的读者可以自己试试。
总的来说,不同类型的文件有不同的编码格式,必须使用对应的程序(软件)才能正确解析,否则就是一堆乱码,或者无法使用。
文本方式和二进制方式并没有本质上的区别,只是对于换行符的处理不同。
在 UNIX/Linux 平台中,用文本方式或二进制方式打开文件没有任何区别,因为文本文件以 \n(ASCII 码为 0x0a)作为换行符号。
但在 Windows 平台上,文本文件以连在一起的 \r\n 作为换行符号。如果以文本方式打开文件,当读取文件时,程序会将文件中所有的 \r\n 转换成一个字符 \n。也就是说,如果文本文件中有连续的两个字符是 \r\n,则程序会丢弃前面的 \r,只读入 \n。
同样当写入文件时,程序会将 \n 转换成 \r\n 写入。也就是说,如果要写入的内容中有字符 \n,则在写入该字符前,程序会自动先写入一个 \r。
因此在 Windows 平台上,如果用文本方式打开二进制文件进行读写,读写的内容就可能和文件的内容有出入。
总的来说,Linux 平台使用哪种打开方式都行;Windows 平台上最好用 "ios::in | ios::out" 等打开文本文件,用 "ios::binary" 打开二进制文件。但无论哪种平台,用二进制方式打开文件总是最保险的。