使用fstream构造函数和打开函数的区别

The difference between using fstream constructor and open function

本文关键字:函数 区别 fstream 构造函数 使用      更新时间:2023-10-16

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

<标题> 1
fstream("file.txt",ios::app);
<标题> 2 h1> 于(1),我不需要再次使用。open函数,对吗?这两个表达式在功能上有什么不同吗?

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

两个代码片段后面的对象的状态没有区别。

为什么有两个版本?

  1. 该函数的存在是为了创建与流直接关联的fstream对象。

  2. open存在,因为这些类型的对象无法复制。因此,您不能通过写入

    fstream对象分配给不同的流:
    fstream foo('bblskd');
    // ...
    foo = fstream('skdjf');
    

(注意这个接口是在move语义之前设计的)。


你可以在这里找到默认的打开模式

不,没有区别。

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

正确。

两种表达在功能上是否有差异?

我想不起来。

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

ios_base::in|ios_base::out。详见http://en.cppreference.com/w/cpp/io/basic_fstream/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构造函数在open之前和之后执行操作。在c++中,这可能不是一个好的实践,但它可能很有用。