2011-09-18 32 views

回答

5

从上ifstream类的构造文档:

二进制(二进制)考虑流作为二进制而不是文本。
in(输入)允许在流上进行输入操作。

所以从文件中读取的时候,我会用std::ifstream::in标志,不是因为它是必需的(或没有),而是因为这将是一个良好的编程习惯,让编程接口知道你要作什么用途。

编辑:
以下是从http://www.cplusplus.com/doc/tutorial/files/拍摄,约open()成员函数虽然(但在问题的代码构造函数可能跟open()复制模式标志不加修改)。

类:默认模式参数
ofstream的:IOS ::出
ifstream的:IOS ::在
的fstream:IOS ::在| IOS ::出

对于ifstream的和ofstream的类,IOS ::在和IOS ::出自动和分别是 假定,即使不 一个模式包括它们作为第二个参数到打开传递()会员 功能。

尽管如此,Web上的很多示例在显示ifstream对象的构造时使用ifstream::in。真的可能是某种迷信的做法,而不是编程。

+1

@ Naveen:我需要让'ifstream'知道我想用它作为_input_吗?我可以简单地使用'fstream' - 这就是为什么我首先发布了这个问题。 :) –

+0

是的,好点:P在编辑中我已经变得柔软了。 –

+1

伙计们,停止upvoting我的答案,因为它并没有真正给出太多的答案,只是表达了个人意见加上给'open()'成员函数一些间接相关的信息。但是,这并不意味着我希望它得到downvoted =) –

1

我不能在网上找到权威的文档。

编辑我什至不能找到一个适当的参考在我的副本Josuttis Book,第8次印刷。 它应该是在第13.9页627-631

经验证据表明它是多余的IFF没有的std :: IOS的​​::在或std :: IOS:出传递:

#include <fstream> 
#include <iostream> 

int main(int argc, char** args) 
{ 
    std::ifstream ifs(args[0], std::ios::binary); 
    std::cout << ifs.rdbuf() << std::flush; 

    return 0; 
} 

成功:

test | md5sum 
md5sum test 

显示相同的哈希总和。


// ... 
    std::ifstream ifs(args[0], std::ios::out | std::ios::binary); 

将失败(零字节输出)

test | wc -c # shows 0 
1

binary,在这种情况下,仅指读写方法。在Windows的常规模式下,'\n'被翻译为'\r''\n'。这可能会影响读取和写入,所以二进制模式会将其关闭。 out|binaryin|binary

相关问题