std::ifstream fin;
fin.open("file.txt", std::ios::in);
std::cout << fin.is_open();
此代码打印false
,因此文件未打开。如何检查它为什么。也许从fin
对象获取错误消息?我猜的原因是该文件已经打开用于写入。但我想打开它阅读。是否可以打开文件进行读写。
我正在使用linux。使用strerror(errno)
我收到错误没有这样的文件或目录,但我存在该文件。也许错误是因为它已经使用其他对象打开了?
它已经使用C API打开,因此fin
无法打开它。如何打开已经打开的文件?
答案 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
(非ostream
或istream
)类并将打开模式设置为{{1 }}
答案 2 :(得分:0)
是。你应该使用fstream而不是ifstream或ofstream。请参考以下链接: http://www.cplusplus.com/doc/tutorial/files/