代码之家  ›  专栏  ›  技术社区  ›  Arun

以读写模式打开文件时出现c++filestream问题

  •  2
  • Arun  · 技术社区  · 7 年前

    请考虑以下代码段:

    const char * filePath = "C:/blah.mtt";
    fstream fs(filePath, ios::in | ios::out | ios::binary);
    if (fs.fail())
       std::cout << "Failed to open the file!\n";
    

    fs。fail()检查始终成功。这是否意味着我不能同时以读写模式打开文件?

    首先创建一个空文件,然后运行上面的代码fs。fail()始终为false。fstream类做出这种行为的理由是什么?

    注: 我确实拥有创建文件所需的权限。我正在使用VS2015在windows 10上尝试此操作

    2 回复  |  直到 7 年前
        1
  •  4
  •   Lightness Races in Orbit    7 年前

    这是否意味着我不能同时以读写模式打开文件?

    不,你可以这样做,但问题是你是否可以 创造 通过这样做创建文件。

    通常,您需要添加 trunc 标志(讽刺的是,这是如何处理现有文件的选项之一),或删除 in 标志(参见 here ).

    是的,这有点痛苦,但它来自于原始POSIXAPI的工作方式。责怪他们!

    首先创建一个空文件,然后运行上面的代码fs。fail()始终为false。fstream类做出这种行为的理由是什么?

    您总是可以打开一个存在的文件(当然,受权限限制)。这种行为是有道理的。

        2
  •  1
  •   Neijwiert    7 年前

    fs。fail()检查始终成功。这是否意味着我不能同时以读写模式打开文件?

    有关更好的解释,请参阅“轨道中的亮度竞赛”。

    首先创建一个空文件,然后运行上面的代码fs。fail()始终为false。fstream类做出这种行为的理由是什么?

    如果你看看 constructor definition 属于 fstream 你可以看到 mode 定义打开它的方式。它还有其他选择,如 app 附加到现有文件。如果使用以下代码打开文件:

    fstream fs(filePath, ios::in | ios::out | ios::binary);
    

    您的意思是,如果不存在,请创建一个新文件。如果您预先创建它,则会失败。您应该添加 应用程序 , ate trunc 如果希望它成功打开,请标记。这取决于你到底想做什么。但是,请注意,在创建和打开文件的步骤之间,并不能保证文件仍然存在。您应该试着一下子完成它,让异常处理完成它的工作,因为您无论如何都不能绕过错误。