C++文件流ios::binary的作用
在创建文件流时,可以显示指定它的打开方式为ios::binary,也就是以二进制方式打开。但是,无论是否指定二进制方式打开文件,读写的最小单位都是字节。那么,它到底起到什么作用呢?以二进制方式打开与普通打开方式的区别是什么?
实际上,二者最大的区别在于对换行符的处理方式不同。由于历史原因,Windows操作系统是用两个字符(\r\n)来表示换行符的;而Unix操作系统却是用单个字符(\n)来表示换行符的。因此,在创建文件流时,如果指定了以ios::binary方式打开,那么换行符就是单字符的;否则,就采用Windows操作系统的双字符。下面用一个简单的例子来观察一下,代码比较简单,注意两种情况仅仅是写入文件时一个采用二进制方式,一个采用默认的方式。
// BinaryIo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <fstream>
int _tmain(int argc, _TCHAR* argv[])
{
std::ofstream out("file.txt");
//std::ofstream out("file.txt", std::ios::binary);
out<<"test\n";
out.close();
std::ifstream in("file.txt", std::ios::binary);
char c;
while((c = in.get()) != EOF) {
if (c == '\r') {
printf("%s", "\\r");
} else if (c == '\n') {
printf("%s", "\\n");
} else {
printf("%c", c);
}
}
in.close();
return 0;
}
第一种情况的结果为:
test\r\n请按任意键继续. . .
第二种情况的结果为:
test\n请按任意键继续. . .
两种情况的区别一目了然,因此我们可以简单总结成:以ios::binary方式打开,换行符被解释成\r\n;反之,换行符被解释成\n。
另外一个问题是在Unix(或类Unix)操作系统中,指定和不指定ios::binary方式是否有区别呢?也就是说这种差异是否仅仅体现在Windows操作系统中。博主没有测试环境,希望有条件的同学能够帮忙测试下,分享一下结果,谢谢。
补充:软件开发 , C++ ,