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

时间:2013-07-25 13:11:20

标签: c++ file io

std::ifstream fin;
fin.open("file.txt", std::ios::in);
std::cout << fin.is_open();

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

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

3 个答案:

答案 0 :(得分:3)

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

该标准filebuf提出任何要求 使用errno,至少不是open的情况,而是使用filebuf 练习,errno将调用更低级别的功能 (希望)使用errno。 (这是Posix所要求的 如果出现错误,系统调用set filebuf。我不太确定 关于Windows。)

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

答案 1 :(得分:0)

回答Q#1:errno以及GetLastError()保留最后的错误信息。要获取错误的字符串消息,请使用:strerrno(errno)

回答问题2:要为读/写打开它,您需要使用fstream(非ostreamistream)类并将打开模式设置为{{1 }}

答案 2 :(得分:0)

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