【问题标题】:Why can an `ifstream` be opened both for reading and writing?为什么可以同时打开“ifstream”进行读写?
【发布时间】:2017-10-25 10:47:14
【问题描述】:

我今天看到了一段有趣的代码:

ifstream fil;

fil.open( "ini.txt", std::ios::in | std::ios::out );

我正要吐槽它的破损,但令我惊讶的是,我看到 cppreference.com 显然认为这是正确的:

http://en.cppreference.com/w/cpp/io/basic_ifstream/open

mode - 指定流打开模式。为位掩码类型,定义如下常量:

  • 在:开放阅读
  • 出:开放写作

ifstream,据我所知是一个 INPUT 文件流,如何同时打开以进行读取和写入?

不应该是fstream而不是ifstream吗?

【问题讨论】:

  • 为此您需要std::fstream
  • @user0042 很好;那么为什么 cppreference 在 IFSTREAM::open 下同时列出 std::ios::instd::ios::out 呢??
  • 您期望什么?例外?
  • @Joe - 你没有“撤消”任何东西。反对票仍然有效。这是某人对这个问题的有效意见。您的意见不同,但不会影响其他人的意见。
  • 如果一棵树倒在森林里,没有人听见,它真的倒了吗?或者换句话说:如果你打开一个istream写,但它没有写API,你真的可以写吗?

标签: c++ file-io fstream


【解决方案1】:

std::ifstream 就像std::basic_filebuf 的句柄。您甚至可以通过调用 std::basic_ifstream::rdbuf 从句柄访问该缓冲区。

您可以从句柄中窃取该缓冲区,然后将其分配给另一个缓冲区(我不会介绍它是如何完成的)。这是有趣的事情。您可以将该缓冲区从ifstream 移动到ofstream。这需要能够打开缓冲区进行写入。因此,您链接的同一个参考页面是这样说的:

有效调用rdbuf()->open(filename, mode | ios_base::in)

这是一个方便的函数,可以避免以后操作缓冲区本身。

【讨论】:

    【解决方案2】:

    你需要使用fstream:

    fstream file("input.txt", ios::in | ios::out | ios::app);
    int data;
    
    file >> data;
    file << data +1;
    
    file.close();
    

    【讨论】:

    • 问题已经表明他们知道它应该是 fstream。他们在问为什么它完全适用于 ifstream。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2015-08-11
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多