C++ 可以在刷新操作的中间写入文件失败

C++ 可以在刷新操作的中间写入文件失败,c++,csv,fflush,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" i

我把内容写到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

我的代码(如果需要)

某物

hash_映射表数据;
//假设这里填充了哈希映射
字符串outFile=“C:\outFile.csv”;
FILE*fout=NULL;
if(outFile.length())
{
fout=fopen(outFile.c_str(),“a”);
}   
如果(fout!=NULL)
{
for(vector::iterator keyValue=keys.begin();
keyValue!=keys.end();++keyValue)
{
fprintf(fout,“%d,”,*keyValue);
fprintf(fout,“%lld\n”,tableData[*keyValue]);
福鲁斯(福特);
}
}

关于
fflush
功能,C标准有以下说明:

如果
指向输出流或更新流,其中最近的 未输入操作,
fflush
函数会导致该流的任何未写入数据 发送到主机环境并写入文件;否则,该行为是错误的 未定义

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

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

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

如果write()请求写入的字节数超过了可容纳的字节数(例如,进程的文件大小限制或介质的物理端),则只能写入可容纳的字节数

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

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

如果绝对不要让文件处于这种状态非常重要,那么请改为将更新写入临时文件,检查所有写入是否在语言级别成功,检查刷新是否成功,最后以原子方式将其重命名为要更新的实际文件


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

C标准对
fflush
功能有以下说明:

如果
指向输出流或更新流,其中最近的 未输入操作,
fflush
函数会导致该流的任何未写入数据 发送到主机环境并写入文件;否则,该行为是错误的 未定义

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

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

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

如果write()请求写入的字节数超过了可容纳的字节数(例如,进程的文件大小限制或介质的物理端),则只能写入可容纳的字节数

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

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

如果绝对不要让文件处于这种状态非常重要,那么请改为将更新写入临时文件,检查所有写入是否在语言级别成功,检查刷新是否成功,最后以原子方式将其重命名为要更新的实际文件


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

编写一个<代码> \n '/COD>不刷新流。你尝试用标准C++写它吗?打印一个无符号长的长,你应该使用%LLD-YouHuy@ RSAHU。我以为不是这样。将编辑它只要文件被正确打开,
fflush()
可能失败的原因很少。想到的唯一的一个是一个满是边沿的磁盘或者一个灾难性的断电。写一个代码> \n’/Cube不会刷新流。你试着用标准C++写它吗?打印一个无符号长的长,你应该使用%LLD-YouHuy@ RSAHU。我以为不是这样。将编辑它只要文件被正确打开,
fflush()
可能失败的原因很少。我唯一想到的是一个满盘的磁盘,或者是一个灾难性的电源故障。为了确保我理解它,我的结论是,如果刷新失败,任何事情都可能发生。可能是上面的任何一个示例,甚至更多(比如垃圾值),并且没有明确的模式或预期的行为(至少在Unix中是这样)。此外,在某些情况下,fflush可能会正确地传递内容,但操作系统由于未知原因无法写入文件。@iluvcornflakes据我所知,在Unix中无法获取垃圾值,至少假设您正在写入日志
 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
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); 
    }
}