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

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

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

4

3 回答 3

3

该标准指定有一个预处理器符号 errno,它扩展为引用 a (thread local) 的东西int,系统函数应在其中放置扩展的错误代码。它还定义了一个函数strerror,它允许在char const*给定此数字的情况下通过文本消息恢复 a(但与 不同errno,该函数不保证是线程安全的)。

该标准对使用没有任何要求,至少在 的情况下没有,但在实践中,将调用将(希望)使用的较低级别的功能。(这是 Posix 要求的,其中所有系统调用都设置为以防出错。我对 Windows 不太确定。)filebuferrnoopenfilebuferrnoerrno

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

于 2013-07-25T13:26:37.647 回答
0

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

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

于 2013-07-25T13:14:14.157 回答
0

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

于 2013-07-25T13:18:55.310 回答