2

考虑以下代码片段:

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 上尝试这个

4

2 回答 2

4

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

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

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

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

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

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

于 2018-02-28T10:47:20.840 回答
1

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

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

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

如果您查看构造函数定义fstream您可以看到它mode定义了您打开它的方式。它具有其他选项,例如app附加到现有文件。如果您使用以下代码打开文件:

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

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

于 2018-02-28T10:35:05.580 回答