【问题标题】:Default mode of fstreamfstream 的默认模式
【发布时间】:2018-04-07 12:00:46
【问题描述】:

我正在查看 SO 帖子 C++ file stream open modes ambiguity。我想知道fstream的默认文件打开方式。一个答案说,

上面的意思是下面的代码用以下代码打开文件 完全相同的打开标志 fstream f("a.txt", ios_base::in | ios_base::out); ifstream g("a.txt", ios_base::out);流的 h("a.txt", ios_base::in);

所以如果我理解正确,如果我创建 fstream 的对象,我应该能够读取或写入。

但下面的代码不会将任何数据写入文件

fstream testFile1;
testFile1.open("text1.txt");
testFile1<<"Writing data to file";
testFile1.close();

但是,如下所示的添加模式会创建带有数据“将数据写入文件”的文本文件

testFile1.open("text1.txt", ios::out);

那么默认模式是否是实现定义的?我正在使用 TDM-GCC-64 工具链。

【问题讨论】:

  • 模式ios::in,以及ios::in | ios::out,要求文件已经存在。否则 open 将失败 - 你忘了检查...

标签: c++ file-handling tdm-gcc


【解决方案1】:

std::fstreams 的默认模式是std::ios::in|std::ios::out。 (Source)

您的代码不向test1.txt 打印任何内容的原因是std::ios::in|std::ios::out 模式不会在文件不存在时创建文件 (Source: table on this page)。

可以使用std::ios::in|std::ios::app模式,从头开始读,从尾开始写,如果文件不存在则创建。请注意,使用app 模式,文件将在每次写入之前搜索到末尾(Source)。

【讨论】:

    【解决方案2】:

    ifstream 的默认模式是inofstream 的默认模式是out。这就是为什么它们以这种方式命名的原因。 fstream 具有no默认模式。

    您的示例仅显示了两个默认值,并且通过省略显式参数来表明这一点。 fstream f("a.txt", ios_base::in | ios_base::out) 使用两个显式参数正是因为没有默认模式。

    【讨论】:

    • 这显然是错误的;默认为in|out。如果您已默认构建它,请查看open()。 (ref)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多