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