【问题标题】:std::fstream doesn't create filestd::fstream 不创建文件
【发布时间】:2012-02-08 18:57:17
【问题描述】:

我正在尝试使用 std::fstream for io 来归档,如果该文件不存在,我想创建它。

  std::fstream my_stream
  my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);
  if(!my_stream)
      std::cout<<"error"<<strerror(errorno);

我得到这个结果: “没有这样的文件或目录。”

在这种情况下如何创建文件?

【问题讨论】:

    标签: c++ stl fstream


    【解决方案1】:

    您在调用 fstream::open() 时指定了 std::fstream::in。这是known 强制它需要现有文件。

    要么从 mode 参数中删除 std::fstream::in,要么指定 std::fstream::trunc 以及其他标志。

    【讨论】:

    • 并注意到trunc 每次都会创建一个空文件。
    • 但是,如果我想打开读写并创建文件,如果它不存在呢?标准 libc open() 可以通过指定O_CREAT 标志来做到这一点。这在 C++ 中是不可能的吗?
    【解决方案2】:

    这有点乱但有效。如果文件存在,则不会覆盖该文件,但如果第一次打开失败,则会创建一个新文件。

    std::fstream my_stream
    my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);
    
    if(!my_stream)
    {
        my_stream.open("my_file_name",std::fstream::binary | std::fstream::trunc | std::fstream::out);    
        my_stream.close();
        // re-open with original flags
        my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out);
    }
    else
    {
        // read something
    } 
    
    // read/write here
    

    【讨论】:

    • 您可以删除第二个 close()。只需使用标志“binary | in | out | trunc”打开它就可以了。
    • 这很晚,但是,不能 my_stream.open("my_file_name",std::fstream::binary | std::fstream::trunc | std::fstream::out) ;只需 my_stream.open("my_file_name", std::ios::out); ?它只是为了暂时创建文件......
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多