【问题标题】:c++ filestream problems when opening file in read write mode以读写模式打开文件时的c ++文件流问题
【发布时间】:2018-02-28 10:29:12
【问题描述】:

考虑以下代码sn-p:

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() 总是为假。 fstream 类的这种行为的合理性是什么?

注意:我确实拥有创建文件的必要权限。我正在使用 VS2015 在 Windows 10 上尝试这个

【问题讨论】:

  • 您确定 Windows 理解您路径中的正斜杠吗?
  • @Quentin 我很确定 Windows 不知道它可以接受正斜杠和反斜杠。
  • @Neijwiert 好吧,甚至 explorer.exe 的某些部分也会让他们窒息,因此我的问题:)

标签: c++ file-handling filestreams


【解决方案1】:

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

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

通常您需要添加trunc 标志(具有讽刺意味的是如何处理现有文件的选项之一),或删除in 标志(请参阅here)。

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

先创建一个空文件,然后运行上面的代码,fs.fail() 总是为假。 fstream 类的这种行为的合理性是什么?

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

【讨论】:

    【解决方案2】:

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

    请参阅 Orbit 答案中的@Lightness Races 以获得更好的解释。

    先创建一个空文件,然后运行上面的代码,fs.fail() 总是为假。 fstream 类的这种行为的合理性是什么?

    如果您查看fstreamconstructor definition,您会发现mode 定义了您打开它的方式。它具有其他选项,例如 app 以附加到现有文件。如果您使用以下代码打开文件:

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

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

    【讨论】:

    • 我想我没有正确解释。如果不先创建空文件,fstream 对象始终处于错误状态(fs.fail() 返回 true)...但是如果我先创建空文件,则 fstream 对象处于良好状态(fs.fail() 返回假)...这不是你说的相反...
    • @Arun:不,这正是 Neijwiert 所说的。虽然我觉得这不是很清楚
    • @LightnessRacesinOrbit 你是对的,我没有正确描述含义。您的回答更好地描述了它。这个问题不应该被标记为重复,因为你提到的帖子几乎是一样的吗?
    • @Neijwiert:Weeeeeeeeeell 也许吧。我是在开始写之后才发现的,现在还没有关闭它的心^_^我认为我们可以说这个问题可以具体回答,因为我们需要消除误解并提供更一般的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多