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 

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操作系统中。博主没有测试环境,希望有条件的同学能够帮忙测试下,分享一下结果,谢谢。

你可能感兴趣的:(VC++,一点思考)