以读写模式打开文件时的c ++文件流问题

c++ filestream problems when opening file in read write mode

考虑以下代码片段:

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 class 这种行为的合理性是什么?

注意:我确实拥有创建该文件的必要权限。我正在使用 VS2015

在 windows 10 上进行尝试

the fs.fail() check succeeds always. Does it mean that I can't open a file in both read write mode at the same time?

参考@Lightness Races in Orbit 的回答以获得更好的解释。

Creating an empty file first and then running the above code, fs.fail() is false always. What is the rational for such a behavior by the fstream class?

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

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

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

Does it mean that I can't open a file in both read write mode at the same time?

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

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

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

Creating an empty file first and then running the above code, fs.fail() is false always. What is the rational for such a behavior by the fstream class?

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