我有一个使用ofstream编写输出的程序。使用Visual Studio编译时,Windows上的所有内容都可以正常工作,但只有在使用GCC编译时才会在Linux上写入空文件。
ofstream out(path_out_cstr, ofstream::out);
if(out.bad()){
cout << "Could not write the file" << flush;
}
else{
cout << "writing";
out << "Content" << endl;
if(out.fail()) cout << "writing failed";
out.flush();
out.close();
}
正在写入的目录具有0777权限。
奇怪的是:没有写任何东西,但没有报告错误。
gcc --version是:( Gentoo 4.3.4 p1.0,pie-10.1.5)4.3.4
我知道代码应该工作,所以我更喜欢寻找建议,可能是错误的,而不是直接的代码修复。
编辑:fwrite似乎以完全相同的方式失败(没有任何内容写入,没有报告错误)。
编辑:如果它有任何意义,我会在我的大学目录上通过SSH检测GCC和程序。我有足够的permisssions来exectute和写文件(ls。&gt; out.txt工作正常),它只有我的程序有麻烦。感谢您的帮助
答案 0 :(得分:7)
适合我,ubuntu g ++ - 4.1。
您是否尝试执行strace ./test
并查看是否对文件进行了write()
次调用?
答案 1 :(得分:2)
最有可能的解决方案是,由于名称或路径出现问题,文件无法在构造函数中打开。如果无法打开文件,则会设置failbit
而不是badbit
位,因此请对此进行测试,而不是使用bad()
:
ofstream out(path_out_cstr, ofstream::out);
if(out.fail()){
cout << "Could not write the file" << flush;
...
fail()
检查是否设置了failbit或badbit,而bad只检查badbit。顺便说一下,我试过你的例子,它没有问题,所以我故意让路径变坏 - 仍然没有问题,但是当我改为fail()
时,它就走上了坏路。
答案 2 :(得分:1)
如果正在创建文件,我可以看到为什么不会写入文件的原因。
检查path_out_cstr
的值。在类Unix系统上,路径用正斜杠“/
”而不是MS-DOS样式的反斜杠“\
”分隔,这可以解释两个操作系统之间行为的差异。 / p>
<强>更新强>
由于我们未能catch
failbit
|一段时间badbit
问题,您可能希望try
异常处理方法......此示例将在报告第一次失败后停止...
#include <fstream>
#include <iostream>
int main(int argc, char* argv[])
{
const char* const path_out = argv[1];
std::cerr.exceptions(std::cerr.goodbit);
std::ofstream the_file_stream;
the_file_stream.exceptions(the_file_stream.badbit | the_file_stream.failbit);
try
{
std::cerr << "Opening [" << path_out << "]" << std::endl;
the_file_stream.open(path_out);
std::cerr << "Writing" << std::endl;
the_file_stream << "Content" << std::endl;
std::cerr << "Flushing" << std::endl;
the_file_stream.flush();
std::cerr << "Closing" << std::endl;
the_file_stream.close();
}
catch (const std::ofstream::failure& e)
{
std::cerr << "Failure: " << e.what() << std::endl;
}
return 0;
}
答案 3 :(得分:0)
使用g ++ 4.4.1
为我工作