【问题标题】:Fstream open file in std::fstream::in | std::fstream::out | std::fstream::app modeFstream 在 std::fstream::in 中打开文件 |标准::fstream::out | std::fstream::app 模式
【发布时间】:2014-03-12 00:30:13
【问题描述】:

我需要能够创建一个不存在的文件。设计如下: 我有 1 个线程用于所有文件 IO,并且在封装文件的数据结构中,我有一个 std::fstream 文件句柄。

我可以在std::fstream::in | std::fstream::out | std::fstream::app模式下创建和打开这个文件吗? 我需要这个,因为我必须使用这个句柄来执行这两项操作 - 读取和写入文件末尾。

但是这不是创建文件。这是我所拥有的:

class file_io
{
   std::string filename;
   std::fstream file_handle;
   file_io(std::string name)
   {
      filename = name;
   }
   void open_file()
   {
      if(!file_handle.is_open())
      {
          file_handle.open(filename.c_str(), std::fstream::in | std::fstream::out | std::fstream::app);
          if(!file_handle.is_open())
          {
              std::cout << "Could not open file " << filename ;
          }
          else
          {
              std::cout << "successfully opened file " << filename;
          }
      }
   }
   ~file_io()
   {
      if(file_handle.is_open)
      file_handle.close();
   }
};

每次我需要写入文件末尾或读取文件内容时,我都会调用 open_file。 但该文件没有被创建。谁能帮我理解我在这里做错了什么,以及解决我的问题的正确方法是什么?

另外,如果唯一的选择是必须使用不同的文件句柄,一个用于追加(也需要在此处创建)和一个用于读取,如果我在追加的文件句柄仍处于打开状态时读取文件是否可以?另外,如果不存在和追加,创建的打开方式应该是什么?

【问题讨论】:

  • FWIW:我想指出您没有指定 public: 或 private:。在一个类中,一切都将默认为私有。你甚至不应该编译调用你的 open 函数的代码。

标签: c++ file-io


【解决方案1】:

因此,阅读有关 std::stream open 方法的文档时,当 open 中同时指定 'in' 和 'app' 时,看起来 open 将失败。试着把“in”关掉,看看会发生什么。

“如果mode同时设置了trunc和app,则打开操作失败。如果设置了但是out没有设置,或者app和in都设置了,也会失败。”

std::fstream reference

【讨论】:

    【解决方案2】:

    根据 C++ 98 文档(我假设您使用的是 C++98),您无法使用 inapp 两种模式打开文件。

    至于文件上有多个句柄,这应该会有所帮助:Reading and writing to the same file using the same fstream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多