使用fstream构造函数和open函数的区别

9

我有一个关于fstream构造函数和.open函数的简单问题。 下面两个表达式有什么区别吗?

1

fstream("file.txt",ios::app);

2

fstream fin;
fin.open("file.txt",ios::app);

对于(1),我不需要再使用.open函数了,对吗?这两个表达式之间有功能上的区别吗?

我的第二个问题是,如果我将openmode留空,那么默认的打开模式是什么?


1
我只会回答你的第一个问题。请每个问题只发布_一个问题。此外,您可以通过阅读您最喜爱的C++标准库文档来回答第二个问题,只需十秒钟。 - Lightness Races in Orbit
http://en.cppreference.com/w/cpp/io/basic_fstream/basic_fstream - Lightness Races in Orbit
哦,我在一些网站上搜索了一下我的第二个问题...是ios_base :: in | ios_base :: out吗? - jackycflau
是的,正如我给你链接的文档中所说的那样! - Lightness Races in Orbit
2
在你的第一个版本中,你错过了标识符,使其成为了一个临时变量。你的意思是:fstream fin("file.txt",ios::app);吗? - Galik
@Galik 不是...我只是在使用fstream的构造函数。 - jackycflau
4个回答

11

你的这两个代码片段并没有在对象状态方面有任何区别。

为什么会有两个版本呢?

  1. 构造函数用于创建与流立即相关联的fstream对象。

  2. open存在是因为这些类型的对象无法复制。因此,你不能通过写入以下内容将fstream对象分配给不同的流:

  3. fstream foo('bblskd');
    // ...
    foo = fstream('skdjf');
    

(请注意:此界面是在移动语义之前设计的。)


您可以在此处找到默认的打开模式here


4
不,这方面没有区别。

3

对于(1),我不需要再使用.open函数,是吗?

是的。

这两个表达式之间有任何功能上的区别吗?

我想不出来有什么区别。

我的第二个问题是,如果我将openmode留空,那默认的打开模式是什么?

它是ios_base::in|ios_base::out。请参见http://en.cppreference.com/w/cpp/io/basic_fstream/open以获取更多详细信息。


0

这是一个非常老的问题,但在我看来,没有一个答案是正确的。

两个版本都是相同的。但是,单独拥有一个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++ 中可能不是一个好的实践,但它可以很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接