Ofstream在linux上写入空文件

时间:2010-05-24 09:33:09

标签: c++ linux gcc ofstream

我有一个使用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工作正常),它只有我的程序有麻烦。

感谢您的帮助

4 个答案:

答案 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

为我工作