0

我一次将内容写入 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

如果需要,我的代码

东西.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); 
    }
}
4

1 回答 1

4

C标准对功能有以下说法fflush

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

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

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

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

如果 write() 请求写入的字节数超过了空间的容量(例如,进程的文件大小限制或介质的物理端),则只应写入有空间的字节数。

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

因此,在类 Unix 系统上,您确实应该为fflush可能使文件处于截断状态的可能性做好准备。

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

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

于 2014-08-13T20:09:49.997 回答