C++ 为什么ofstream有时会创建文件,但却可以';你不给他们写信吗?

C++ 为什么ofstream有时会创建文件,但却可以';你不给他们写信吗?,c++,file-io,C++,File Io,我试图使用ofstream类将一些内容写入文件,但所发生的只是创建了文件,然后什么都没有。我这里有一些简单的代码: #include <iostream> #include <fstream> #include <cstring> #include <cerrno> #include <time.h> using namespace std; int main(int argc, char* argv[]) { ofst

我试图使用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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
流文件;
打开(“test.txt”);
如果(!文件){
库特
只需要一点提示:您可以将其组合成一行。
流文件(“test.txt”);

if(文件){

cout更新仔细想想,无法通过
fstreams
打开文件不能保证设置
errno
。可能会在某些平台上设置
errno
(特别是如果这些平台使用
文件*
或文件描述符或其他设置
错误号的库执行
fstream
操作,但这并不保证。检查故障的官方方法是通过,或
std::fstream
上的帮助方法(如或)。不幸的是,您无法从
std::streams
中获得与从
errno
中一样多的信息

您的if语句错误。如果文件不可写,则返回
NULL
(也称为
false
)。如果文件可写,则返回非零(也称为
true
)。因此您希望:

if (!file) {
        cout << strerror(errno) << endl;
} else {
        cout << "All is well!" << endl;
}
if(!文件){

cout只是一个想法:-在您的真实代码中,您正在使用流对象吗


如果是这样,您需要确保在重新使用对象之前调用流,否则,如果存在以前的错误状态,它将无法工作
在这样一个流上会产生一个无法写入的空文件,正如您在问题中所描述的。

本质上,您发布的代码示例有效?都德..请复制错误!我可以发布整个项目,但我想你们不想为我浏览数千行代码。代码示例是为了说明e正在发生什么和应该发生什么。问题的一部分正是因为我不知道是什么导致了这个bug,所以我不知道如何复制它。这就是为什么我要问一些可能导致这个行为的事情。谢谢你的评论。第一件事是故意的,因为在实际的应用程序
文件中
是一个类属性,因此它已在头文件中声明,我只能稍后打开。我修复了向后检查,它在我的实际代码中实际上是正确的。我实际上不知道strerror()的作用,但我在相关问题的某个地方看到了它(没有解决方案)我想我会用它来提供更多信息。我想你应该让你的测试程序可靠地重现错误,然后再试一次。至于strerror(),这在Unixy系统上是最常见的,在Unixy系统上,来自OS和RTL的每个错误都会用errno发出信号。在Windows上,你想看看像GetLastError()这样的东西是的,谢谢,我的问题倒过来了,但不是在我的实际代码中。我现在修复了它,但问题仍然存在。
    if (file) {
            cout << strerror(errno) << endl;
    } else {
            cout << "All is well!" << endl;
    }
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;
}