1

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

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];
4

2 回答 2

2

Mike 的回答将允许您覆盖文件的内容,但不是以您想象的面向行的方式。

您无法调整文件的内部内容,这样,如果您插入内容,则会稍后推送现有的后续数据,如果您删除内容,则会将现有的后续数据拉到删除点之后。

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

但是,您既没有截断也没有覆盖的任何旧数据都保留在原处。在任何情况下它都不会被移动。

因此,如果您想更改文本文件的第一行,并且如果您不能确定新行与旧行的长度完全相同,那么您必须注意从第二行移动所有内容到它的新位置。适用于小文件的一种简单方法是将整个内容读入内存,在那里进行调整,然后将其全部写出。另一种方法是遍历文件,读取块,然后将它们写到新位置。如果您将数据移向起点,则从头开始;如果您将数据移向末尾,则从末尾开始。

于 2012-05-12T03:52:38.293 回答
1

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

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

[fileHandle seekToEndOfFile];

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

[fileHandle seekToFileOffset: 0];
于 2012-05-12T03:09:29.190 回答