为什么ofstream有时会创建文件但无法写入文件?

时间:2009-10-16 16:34:50

标签: c++ file-io

我正在尝试使用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)

谢谢!

3 个答案:

答案 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打开文件无法保证设置errnoerrno最终可能会在某些平台上设置(特别是如果这些平台使用fstream或文件描述符实现FILE*操作,或者设置errno的其他库,但是不保证。检查失败的官方方法是std::fstreamexceptionsstd::streams上的辅助方法(如std::io_statefail)。很遗憾,您无法从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}}