我有一个关于fstream构造函数和.open函数的简单问题。 下面两个表达式有什么区别吗?
1
fstream("file.txt",ios::app);
2
fstream fin;
fin.open("file.txt",ios::app);
对于(1),我不需要再使用.open函数了,对吗?这两个表达式之间有功能上的区别吗?
我的第二个问题是,如果我将openmode留空,那么默认的打开模式是什么?
你的这两个代码片段并没有在对象状态方面有任何区别。
为什么会有两个版本呢?
构造函数用于创建与流立即相关联的fstream
对象。
open
存在是因为这些类型的对象无法复制。因此,你不能通过写入以下内容将fstream
对象分配给不同的流:
fstream foo('bblskd');
// ...
foo = fstream('skdjf');
(请注意:此界面是在移动语义之前设计的。)
您可以在此处找到默认的打开模式here。
对于(1),我不需要再使用.open函数,是吗?
是的。
这两个表达式之间有任何功能上的区别吗?
我想不出来有什么区别。
我的第二个问题是,如果我将openmode留空,那默认的打开模式是什么?
它是ios_base::in|ios_base::out
。请参见http://en.cppreference.com/w/cpp/io/basic_fstream/open以获取更多详细信息。
这是一个非常老的问题,但在我看来,没有一个答案是正确的。
两个版本都是相同的。但是,单独拥有一个open的原因是当您想要创建自己的类并继承basic_fstream时。并且您想在构造函数之前和/或之后对输入执行某些操作。
class MoleStream : public std::basic_fstream<char> {
public:
MoleStream () : std::basic_fstream<char> ("defaultmole") { }
MoleStream ( const char *fn ) {
std::string s = fn; s+=".mole";
std::basic_fstream<char>::open (s);
if ( !is_open() )
std::basic_fstream<char>::open (fn);
}
};
第二个 MoleStream 构造函数在打开之前和之后执行一些操作。这在 C++ 中可能不是一个好的实践,但它可以很有用。
fstream fin("file.txt",ios::app);
吗? - Galik