可以在刷新操作过程中写入文件失败

时间:2014-08-13 20:00:10

标签: c++ csv fflush

我正在将内容写入csv文件 一次一行 ,并且想知道在刷新操作过程中写入是否会失败

我的目的是了解写入文件的不同方式可能会被破坏

假设以下是成功写入后的csv文件的结构

 1,1001210212
 2,8941321654
 6,845646
 17,564968896

在将第3行刷新到文件时发生错误,是否会导致以下形式

 1,1001210212\n       //showing \n just for understanding purpose. Not actually visible as "\n" in the file
 2,8941321654\n 
 6,845

或者

 1,1001210212\n
 2,8941321654\n

1,1001210212\n
2,8941321654\n
6,845646\n              //Fails right after writing the line. Not sure if such an error is even possible

1,1001210212\n
2,8941321654\n
6,845646

我的代码(如果需要)

  

something.cpp

hash_map<int, unsigned long long> tableData;

//assume hash map is populated here

string outFile = "C:\outFile.csv";
FILE *fout = NULL;

if (outFile.length())
{
    fout = fopen(outFile.c_str(), "a");
}   
if (fout != NULL)
{
    for (vector<uint32_t>::iterator keyValue = keys.begin(); 
    keyValue != keys.end(); ++keyValue)
    {
        fprintf(fout,"%d,",*keyValue);
        fprintf(fout,"%lld\n",tableData[*keyValue]); 
        fflush(fout); 
    }
}

1 个答案:

答案 0 :(得分:3)

C标准有关于fflush功能的以下内容:

  

如果stream指向输出流或最新的输出流   如果没有输入操作,fflush函数会导致该流的任何未写入数据   要传递到主机环境以写入文件;否则,行为是    未定义。

请注意谨慎的措辞:数据传递到主机环境。主机环境对它的作用超出了C标准的范围。

fflush功能可能会失败。在这种情况下,它返回非零值。当刷新操作失败时,文件实际发生的是由操作系统定义的,而不是C编程语言。

C与POSIX紧密集成。在POSIX系统上,fflush可能会调用write。 POSIX说,

  

如果write()请求写入的字节多于有空间(例如,进程的文件大小限制或介质的物理端),则只写入有空间的字节数

此外,write可能会被信号中断。因此,如果在刷新操作期间信号终止进程,则只能写入部分数据。

因此,在类Unix系统上,你应该准备好fflush可能使文件处于截断状态。

如果永远不要让文件处于这种状态是至关重要的,那么请将更新写入临时文件,检查所有写入是否在语言级别成功,检查刷新是否成功,最后将其原子重命名为实际要更新的文件。

如果你在Windows上运行,我不知道提供了什么样的保证。