C++ 为什么ofstream有时会创建文件,但却可以';你不给他们写信吗?
我试图使用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
#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;
}