Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Objective c 替换文件中的一行_Objective C_Iphone Sdk 3.2 - Fatal编程技术网

Objective c 替换文件中的一行

Objective c 替换文件中的一行,objective-c,iphone-sdk-3.2,Objective C,Iphone Sdk 3.2,我有一个非常大的文本文件,我的iPad程序偶尔需要替换一行数据(换行符:'\n')。我怎样才能有效地做到这一点?一次写入整个文件不是一个选项 我一直在研究NSFileHandle,它看起来可以满足我的需要;现在我很难找到X行,然后用字符串中的数据替换它。我想完成后,我需要做的就是调用synchronizeFile,对吗 我感谢你的帮助 如果不写入整个文件,就无法真正做到这一点。你可以找到行首,然后写新行。但首先你得找出那条线的偏移量。如果您还没有,这意味着从开始到那一行读取文件。然后,您可以编写

我有一个非常大的文本文件,我的iPad程序偶尔需要替换一行数据(换行符:'\n')。我怎样才能有效地做到这一点?一次写入整个文件不是一个选项

我一直在研究NSFileHandle,它看起来可以满足我的需要;现在我很难找到X行,然后用字符串中的数据替换它。我想完成后,我需要做的就是调用synchronizeFile,对吗


我感谢你的帮助

如果不写入整个文件,就无法真正做到这一点。你可以找到行首,然后写新行。但首先你得找出那条线的偏移量。如果您还没有,这意味着从开始到那一行读取文件。然后,您可以编写新行,但前提是新行的长度与原始行的长度完全相同。如果更长,它将覆盖下一行-无法将数据插入文件。如果新线比旧线短,则旧线的末端将保留。同样的长度要求也很棘手。这意味着相同的字节长度。根据字符编码的不同,某些字符可能需要比其他字符更多的字节

如果您真的需要这样做,并使其适用于每种情况,您必须使用以下步骤:

  • 阅读整个文件,找出您感兴趣的线的偏移量
  • 寻找直线的偏移量
  • 写新行
  • 写出您在步骤1中读取的文件的其余部分
  • 不管这些行有多长或短,也不管它们是如何编码的,这个算法都能工作。但是这可能比仅仅写出整个文件要昂贵,特别是如果你在内存中有它的话


    您是否确实验证了写出整个文件是不可接受的,或者您是否在这里进行过早的优化?如果你的文本文件真的那么大,你应该考虑一个数据库,比如SQLite,或者使用核心数据。

    一个数据库会很好,但不幸的是它不能工作;该应用程序旨在更新一个庞大的csv数据库。我认为应用程序可以将csv文件转换为数据库以进行正常操作,并在命令下将数据库转换回csv,但将数组转换回字符串格式以进行写入对于csv文件的大小来说是昂贵的,从应用程序中检索csv文件可能会导致错误。将csv数据库转换为数组实际上相对便宜-我发现一个像样的C库可以快速完成大部分工作。打开文件并将其转换为多维数组大约需要1秒的时间。使用-stringByAppendingString:或-stringByAppendingFormat:来重新组合csv文件是一个昂贵的部分,它至少需要一分钟(我从来没有费心去弄清楚它运行了多长时间;1秒可能是可以接受的,但2秒太长了)。将NSStrings转换为c字符串或NSData会使编写csv文件更快吗?还有其他想法吗?您真的使用
    stringByAppendingFormat:
    将整个CSV文件重新创建为单个字符串吗?这必须减慢速度,因为每次都必须复制您要附加到的整个字符串。相反,使用
    NSMutableString
    应该可以加快速度,特别是如果您使用
    initWithCapacity:
    来初始化它以保留足够的空间。与将整个内容构建为单个字符串相比,逐行写入文件可能更快。逐行写入文件是否意味着在重新编写文件时截断文件并将每一行csv写入磁盘?为什么这比一次将整个文件写入磁盘要快呢?谢谢你的关注,斯文。我花了一些时间来简化保存过程,现在我在后台编写,所以我能够缓解这个问题。谢谢你的回答-这是信息量大的!