覆盖文件中的当前内容

时间:2012-05-12 02:57:46

标签: objective-c ios xcode

我想覆盖名为data.txt的my文本文件开头的当前数据(在我的资源文件夹中)。总是只有一行(没有空格或任何东西),我希望在适当的时候覆盖这一行。这就是我到目前为止这样做的方法,但这只是在文件末尾写入内容而不是从头开始,也就是覆盖我需要的行。如果有人可以帮助我,将不胜感激。谢谢!

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

//append filename to docs directory
NSString *myPath =  [documentsDirectory stringByAppendingPathComponent:@"data.txt"];
fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:myPath];

writtenString= [[NSString alloc]initWithFormat:@"%d", message];     

[fileHandle seekToEndOfFile];
[fileHandle writeData:[writtenString dataUsingEncoding:NSUTF8StringEncoding]];

[writtenString release];

2 个答案:

答案 0 :(得分:2)

迈克的答案将允许你覆盖你文件的内容,但不是你想象的一种很好的面向行的方式。

您无法调整文件的内部内容,以便在插入内容时,以后会推送现有的后续数据,如果删除了内容,现有的后续数据将被提取到删除点。

您有两个基本操作可用:您可以截断一定长度的文件,可能为0,丢弃该点之后的任何旧数据。您可以在某个位置写入数据。如果该位置已有数据,则会被覆盖(即丢失)。如果您要写入的字节范围超出文件末尾,则会扩展该文件。

但是,任何既未截断也未覆盖的旧数据仍然存在。在任何情况下都不会移动。

因此,如果您想要更改文本文件的第一行,并且如果您不能确定新行与旧行的长度完全相同,那么您必须处理从第二条线到了它的新位置。一种适用于小文件的简单方法是将整个内容读入内存,在那里进行调整,然后再将其全部写出来。另一种方法是迭代文件,读取块然后将它们写入新的位置。如果您要将数据移至开头,则从头开始;如果你要将数据移到最后,那么就从最后开始。

答案 1 :(得分:1)

  

这就是我到目前为止这样做的方法,但这只是在文件末尾写入内容而不是从头开始,也就是覆盖我需要的行。

嗯,是的,因为你打电话:

[fileHandle seekToEndOfFile];

它正在按你的要求做。尝试:

[fileHandle seekToFileOffset: 0];