在Linux上,Ofstream写入空文件

3

我有一个程序,它使用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和程序,如果有任何意义的话。我有足够的权限来执行和写入文件(ls . > out.txt非常正常),只有我的程序有问题。
感谢您的帮助。

1
在FC12下,使用g++ 4.4.3对我来说可行。 - nico
在Linux下,你的程序的输出(如cout)是什么? - UncleZeiv
无论文件是否存在,它最终总是为空。 - Matěj Zábský
这是全部的代码吗?你确定没有其他打开/截断文件的代码吗? - nos
你的程序可能没有足够的权限吗?- 不熟悉Unix。 - default
显示剩余2条评论
4个回答

7

这对我来说可行,使用ubuntu g++-4.1。
你尝试执行strace ./test并查看文件中是否有write()调用了吗?


是的,写入调用已经存在。 - Matěj Zábský
写入调用都在那里了吗?那么和代码就没有关系了。:S 我猜 cat "something" > test_file 可以工作? - Arkaitz Jimenez
1
哦,现在我看到strace输出中隐藏着“磁盘配额超限”的信息。感谢您的帮助,我之前不知道strace。 - Matěj Zábský

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()时,它就会发现路径错误。


1
如果文件正在创建,我看不出为什么它不会被写入。
请检查path_out_cstr的值。在类Unix系统中,路径使用正斜杠“/”而不是MS-DOS风格的反斜杠“\”进行分隔,这可能解释了两个操作系统之间行为差异的原因。

已更新

由于我们在一段时间内未能捕获failbit | badbit问题,您可能希望尝试异常处理方法...此示例将在报告第一个失败后停止...

#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;
}

path_out_cstr是程序的命令行参数,因此它是我输入的内容。另外,如果路径错误,文件甚至都不会被创建。 - Matěj Zábský
当然,你是对的。我提供了一些示例代码,可能有助于在未来捕获类似的错误。 - johnsyweb

0

在我这里使用 g++ 4.4.1 可以工作。


gcc版本为:(Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4我知道代码应该是可以正常工作的,所以我更希望得到一些建议,看看可能出了什么问题,而不是直接修复代码。 - Matěj Zábský
1
@commanderz:我怀疑这不是代码问题。你尝试过更改输出目录了吗? - nico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接