数据不是使用ofstream编写的,即使返回成功

时间:2017-08-08 17:54:25

标签: c++ ofstream

我正在编写一个程序,使用libcurl获取大量电子邮件文件,然后将文件写入磁盘,然后生成收据。

我的问题是,虽然大多数收据似乎都是写的,但大部分电子邮件都没有写入磁盘。更糟糕的是,即使文件没有写入,ofstream也会返回成功 - 因此即使文件写入未成功完成,收据也会被写入。

我的猜测是,因为ofstream是异步的,如果写入没有及时完成,那么它将被丢弃在地板上 - 只有一定数量的写入可能同时发生。我只想猜到这里。 也许我需要重构我的代码来同步编写 - 但我不相信这是必要的。有谁知道如何才能使这项工作?

电子邮件大小从几KB到几MB不等。

$

这是另一个功能的一部分,并且已被删除,因此只显示此问题的显着代码。

int write_file(string filename, string mail_item) {
    ofstream out(filename.c_str());
    out << mail_item;
    out.close();
    out.flush();
    if (!out) {
        return FUNCTION_FAILED;
    }
    return FUNCTION_SUCCESS;
}

感谢所有建议!谢谢!

1 个答案:

答案 0 :(得分:0)

好。我找到了答案 - 可能有更好的答案 - 但这个对我有用。问题似乎出现在OS(Linux,在这种情况下) - ofstream完成,已经将文件写入操作系统的责任,但文件还没有实际写入(所以虽然ofstream可能是同步的文件的端到端写入,从数据到文件安全地写入磁盘,是不是。鉴于我已经快速连续地(可能有数千个)大量写入,这不一定有效。操作系统可能会抛弃它并将大量文件写入地板(因此我原始请求以同步方式编写文件 - 端到端)。

我的解决方案是在每次写入后暂停,以便让操作系统有时间赶上。虽然它不优雅,但并不像它应该的那样高效 - 它不需要半秒钟来写一个空文件。此外,在缓慢存储时,半秒可能没有足够的时间。我欢迎任何关于如何改进我的代码的聪明建议。

int write_file(string filename, string mail_item) {
    ofstream out(filename.c_str());
    if (!out) {
        return FUNCTION_FAILED;
    }
    out << mail_item << endl;
    out.flush();
    usleep(500000); //wait for half a second to give the OS time to output the file
    if (!out) {
        return FUNCTION_FAILED;
    }
    out.close();
    if (!out) {
        return FUNCTION_FAILED;
    }
    return FUNCTION_SUCCESS;
}