我正在将内容写入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);
}
}
答案 0 :(得分:3)
C标准有关于fflush
功能的以下内容:
如果
stream
指向输出流或最新的输出流 如果没有输入操作,fflush
函数会导致该流的任何未写入数据 要传递到主机环境以写入文件;否则,行为是 未定义。
请注意谨慎的措辞:数据传递到主机环境。主机环境对它的作用超出了C标准的范围。
fflush
功能可能会失败。在这种情况下,它返回非零值。当刷新操作失败时,文件实际发生的是由操作系统定义的,而不是C编程语言。
C与POSIX紧密集成。在POSIX系统上,fflush
可能会调用write
。 POSIX说,
如果write()请求写入的字节多于有空间(例如,进程的文件大小限制或介质的物理端),则只写入有空间的字节数
此外,write
可能会被信号中断。因此,如果在刷新操作期间信号终止进程,则只能写入部分数据。
因此,在类Unix系统上,你应该准备好fflush
可能使文件处于截断状态。
如果永远不要让文件处于这种状态是至关重要的,那么请将更新写入临时文件,检查所有写入是否在语言级别成功,检查刷新是否成功,最后将其原子重命名为实际要更新的文件。
如果你在Windows上运行,我不知道提供了什么样的保证。