前段时间在iOS平台构建算法的Simulation工程,输出结果出现了数据丢失现象,我们的算法是使用 fread()
函数一帧一帧读取,然后进行算法处理,最后使用 fwrite()
函数输出算法处理后的数据写入文件,但是发现保存的文件大小不对。
于是了解使用了以下几个函数。仅作记录,具体用法可以再做详细查询。
fflush()
函数、fsync()
,fdatasync()
函数。
关于 Linux IO同步函数:sync、fsync、fdatasync,点击这个链接,可以详细了解几个函数的用法和区别。
以下是摘自码农家园
:关于C#:将stdout记录到文件的长时间延迟 的内容。
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv){
FILE *fp = fopen("test.txt","w");
char *line ="Test
";
char *fill ="\0";
fwrite(fill, 1, 100*strlen(line), fp);
fflush(fp);
fsync(fileno(fp));
rewind(fp);
for (int i = 0; i < 100; i++){
fwrite(line, strlen(line), 1, fp);
fflush(fp);
fdatasync(fileno(fp));
}
}
ps:
当然,我们的数据丢失问题经过以上几个函数还是没有解决,个别iPhone机型还是存在数据丢失问题。😦
但是上面几个函数可以排除一些问题的可能性,对了打开文件记得fclose()
,执行fclose 了,就会一次性将缓冲区未写完的数据写进文件。