如何检查文件未打开的原因

How to check why file is not opened?

本文关键字:文件 何检查 检查      更新时间:2023-10-16
std::ifstream fin;
fin.open("file.txt", std::ios::in);
std::cout << fin.is_open();

此代码打印false,因此不会打开文件。如何检查为什么。也许从对象fin收到错误消息?我猜原因是文件已经打开进行写入。但我想打开它阅读。是否可以打开文件进行读取和写入。?

我正在使用Linux。有了strerror(errno)我得到错误没有这样的文件或目录,但我的文件存在。也许错误是因为它已经使用其他对象打开了?它已经使用 C API 打开,因此fin无法打开它。如何打开已经打开的文件?

该标准指定存在预处理器符号 errno ,它扩展到引用 (线程( 的内容local( int ,其中系统函数应放置扩展错误代码。 它还定义了一个函数strerror ,允许使用短信恢复char const*,给定这个数字(但与errno不同,该函数不是保证是线程安全的(。

该标准filebuf使用errno,至少不是在open的情况下,而是在实践,filebuf将调用较低级别的函数,这些函数将(希望(使用errno. (这是Posix所要求的,其中所有的系统调用设置errno,以防出错。 我不太确定关于视窗。

至于双向访问:这可能是一个坏主意,但是...... filebuf总是潜在的双向的,但ifstream不会定义任何<<运算符,ofstream也不会定义任何 >>运算符,因此您可能希望使用 std::fstream . 如果你想要能够搜索,您还需要在二进制模式;否则,你只能寻找你去过的地方到之前,并记住了位置。 如果你想阅读什么你刚刚写过,更好的解决方案是关闭输出,然后打开它进行阅读。

回答 Q#1:errno 并且GetLastError()保存最后一个错误信息。要获取错误的字符串消息,请使用:strerrno(errno)

答案 Q#2:要为读/写打开它,您需要使用 fstream(不是 ostreamistream(类并将打开模式设置为 std::ios::in | std::ios::out

是的。 您应该使用 fstream 而不是 ifstream 或 ofstream。 请参考以下链接:http://www.cplusplus.com/doc/tutorial/files/