请考虑以下代码段:
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上尝试这个。
答案 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);
您所说的创建新文件(如果它不存在)。如果您预先创建它,则会失败。如果您希望成功打开,则应添加app
,ate
或trunc
标记。这取决于你想要做什么。但请注意,在创建然后打开它的步骤之间并不能保证文件仍然存在。您应该尝试一下子完成它并让异常处理完成它的工作,因为您无论如何都无法绕过错误。