在读写模式下打开文件时出现c ++文件流问题

时间:2018-02-28 10:29:12

标签: c++ file-handling filestreams

请考虑以下代码段:

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 个答案:

答案 0 :(得分:2)

  

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

不,您可以这样做,但问题是您是否可以创建文件。

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

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

  

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

您始终可以打开存在的文件(具体取决于权限)。这种行为是有道理的。

答案 1 :(得分:0)

  

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

有关更好的解释,请参阅Orbit答案中的@Lightness Races。

  

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

如果查看fstream的{​​{3}},您会发现mode定义了打开它的方式。它还有其他选项,例如app可附加到现有文件。如果使用以下代码打开文件:

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

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