我正在尝试使用ofstream类将一些东西写入文件,但所有发生的事情都是文件被创建,然后什么都没有。我这里有一些简单的代码:
#include <iostream>
#include <fstream>
#include <cstring>
#include <cerrno>
#include <time.h>
using namespace std;
int main(int argc, char* argv[])
{
ofstream file;
file.open("test.txt");
if (!file) {
cout << strerror(errno) << endl;
} else {
cout << "All is well!" << endl;
}
for (int i = 0; i < 10; i++) {
file << i << "\t" << time(NULL) << endl;
}
file.flush();
file.close();
return 0;
}
当我创建一个控制台应用程序时,一切正常,所以我担心这段代码不完全具有代表性。但是,我在一个更大的项目中使用这样的代码 - 说实话 - 我不完全理解(Neurostim)。我应该写一些编译成dll的类,可以由Neurostim加载。
运行代码时,会创建“test.txt”,然后“No error!”打印,因为这显然是strerror的输出。显然这是错误的。否则应用程序运行完美,而不是因为我正在尝试写入损坏的流这一事实。它只是不这样做。在我看来,权限没有问题,因为实际上是创建了文件。
有没有人有什么想法会导致这种奇怪的行为? (我使用的是WinXP Pro SP3并使用Visual C ++ 2008 Express Edition)
谢谢!
答案 0 :(得分:4)
只是想一想: - 在您的真实代码中,您是否重新使用了流对象?
如果是这样,您需要确保在重新使用对象之前在流上调用clear()
,否则,如果存在先前的错误状态,则它将无效。我记得,如你在问题中描述的那样,不在这样的流上调用clear()
会导致无法写入的空文件。
答案 1 :(得分:2)
ofstream file;
file.open("test.txt");
只是一个问题:你可以将它组合成一行。 ofstream file("test.txt");
if (file) {
cout << strerror(errno) << endl;
} else {
cout << "All is well!" << endl;
}
您的测试是倒退的。如果file
为真,则它已打开并准备好写作。
另外,我不会指望strerror()在Windows上正常工作。大多数Windows API不使用errno来发出错误信号。如果您的失败发生在C / C ++运行时库之外,这可能不会告诉您任何有趣的事情。
答案 2 :(得分:0)
更新更多地考虑这一点,无法通过fstreams
打开文件无法保证设置errno
。 errno
最终可能会在某些平台上设置(特别是如果这些平台使用fstream
或文件描述符实现FILE*
操作,或者设置errno
的其他库,但是不保证。检查失败的官方方法是std::fstream
,exceptions或std::streams
上的辅助方法(如std::io_state
或fail
)。很遗憾,您无法从errno
获取尽可能多的NULL
信息。
你的if语句错了。如果文件不可写,则bad
会返回false
(a.k.a。true
)。如果文件是可写的,则返回非零(a.k.a。if (!file) {
cout << strerror(errno) << endl;
} else {
cout << "All is well!" << endl;
}
)。所以你想要:
if (!file.good()) {
cout << strerror(errno) << endl;
} else {
cout << "All is well!" << endl;
}
或者:
{{1}}