Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone文件损坏_Iphone_File_Atomic_Corruption_Stdio - Fatal编程技术网

iPhone文件损坏

iPhone文件损坏,iphone,file,atomic,corruption,stdio,Iphone,File,Atomic,Corruption,Stdio,是否可以(在iPhone/iPod Touch上)编写这样的文件: if (FILE* file = fopen(filename, "wb")) { fwrite(buf, buf_size, 1, file); fclose(file); } 损坏,例如当应用程序被迫终止时 据我所知,fwrite应该是一个原子操作,所以当我用一条指令编写整个文件时,不应该发生损坏。我在网上找不到任何与此相反的信息。您可以让事情变得更简单,并使用具有writeToFile:atomical

是否可以(在iPhone/iPod Touch上)编写这样的文件:


if (FILE* file = fopen(filename, "wb")) {
    fwrite(buf, buf_size, 1, file);
    fclose(file);
}
损坏,例如当应用程序被迫终止时


据我所知,fwrite应该是一个原子操作,所以当我用一条指令编写整个文件时,不应该发生损坏。我在网上找不到任何与此相反的信息。

您可以让事情变得更简单,并使用具有
writeToFile:atomicaly:
方法等待您的类来编写数据。用
NSData
包装原始缓冲区并不难,有
dataWithBytes:length
datawithbytesnopy:length:freewwhendone:
初始化器。

缓冲用
fwrite
写入的数据。因此,突然终止可能不会刷新缓冲区
fclose
将刷新缓冲区,但这并不意味着字节也会写入磁盘(由于操作系统级缓存)AFAIK

从何时起,
fwrite
是原子的?我找不到任何推荐人。无论如何,即使
fwrite
可以是原子的,但是
fopen
fwrite
之间的时间不是原子的,因此如果你的应用程序在这两个时间之间被迫终止,你会得到一个空文件


在编写iPhone操作系统时,您可以使用
-[NSData writeToFile:atomicaly://code>确保整个打开-写入-关闭过程是原子的(它通过写入临时文件,然后替换原始文件来工作)。

fclose将刷新缓冲区,我错了吗?不刷新缓冲区不会损坏文件。fclose确实也会刷新缓冲区。@sfider:不刷新缓冲区会损坏文件。示例:假设缓冲区为512字节,数据为1200字节。fwrite将前1024个字节写入磁盘,其余176个字节保留在缓冲区中。因此,该文件不完整且可能已损坏。iPhoneOS源于Mac OS X,Mac OS X完全符合POSIX,POSIX标准要求C stdio file*操作是原子操作。然而,你是对的,如果福瑞特不会在fopen之后被调用,我可能会有腐败。我得检查一下。