C++ 未使用ofstream写入的数据,即使返回成功

C++ 未使用ofstream写入的数据,即使返回成功,c++,ofstream,C++,Ofstream,我正在编写一个程序,它使用libcurl获取大量电子邮件文件,然后将文件写入磁盘,然后生成收据 我的问题是,虽然大多数收据似乎都被写入了,但大多数电子邮件都没有写入磁盘。更糟糕的是,即使文件没有被写入,ofstream也会返回成功-因此即使文件写入没有成功完成,收据也会被写入 我的猜测是,因为流是异步的,如果一个写操作没有及时完成,那么它将被丢弃在地板上——只有一定数量的写操作可以同时进行。我只是在猜。 也许我需要重构我的代码来同步编写——但我不相信这是必要的。有人知道我怎样才能做到这一点吗 电

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

我的问题是,虽然大多数收据似乎都被写入了,但大多数电子邮件都没有写入磁盘。更糟糕的是,即使文件没有被写入,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;
}
int写入文件(字符串文件名、字符串邮件项){
流输出(filename.c_str());

out好的。我找到了一个答案——可能有更好的答案——但这个答案对我来说很有效。问题似乎出在操作系统(本例中为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;
}
int写入文件(字符串文件名、字符串邮件项){
流输出(filename.c_str());
如果(!out){
返回函数_失败;
}

out尝试在打开流之后、写入流之后、关闭流之后检查流的状态。刷新后不需要执行此操作,因为不需要刷新(流缓冲区将作为关闭的一部分刷新)。粘贴的代码有问题…
int write_文件(字符串文件名、字符串邮件项){
是一个函数声明,紧接着它就是一个
for
循环。为什么不在
out@Alex之后立即放置
if(!out){
呢?这是一个函数定义,很精确,但是是的。确保在输出的末尾有一个新行(
'\n'
)。这可能没有帮助,但从技术上来说是必需的。
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;
}