在Objective-C中处理大型文本文件的适当方式是什么?假设我需要单独读取每一行,并希望将每一行都视为一个NSString。执行此操作的最有效方法是什么?
一种解决方案是使用NSString方法:
+ (id)stringWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc
error:(NSError **)error
然后用换行分隔符拆分行,然后迭代数组中的元素。然而,这似乎相当低效。有没有一种简单的方法可以将文件作为流处理,枚举每一行,而不是一次性读取所有文件?有点像Java的java.io.BufferedReader。
发布于 2010-08-04 07:30:37
Mac是Unix,Objective-C是C超集,所以你可以只使用<stdio.h>
的老式fopen
和fgets
。它肯定会起作用。
[NSString stringWithUTF8String:buf]
会将C字符串转换为NSString
。还有一些方法可以用其他编码创建字符串,也可以在不复制的情况下创建字符串。
发布于 2009-06-25 16:46:56
您可以使用NSInputStream
,它有一个基本的文件流实现。您可以将字节读入缓冲区(read:maxLength:
方法)。您必须自己扫描缓冲区中的换行符。
发布于 2016-03-08 03:50:10
这些答案中的许多都是很长的代码块,或者它们在整个文件中读取。我喜欢使用c方法来完成这项任务。
FILE* file = fopen("path to my file", "r");
size_t length;
char *cLine = fgetln(file,&length);
while (length>0) {
char str[length+1];
strncpy(str, cLine, length);
str[length] = '\0';
NSString *line = [NSString stringWithFormat:@"%s",str];
% Do what you want here.
cLine = fgetln(file,&length);
}
注意,fgetln不会保留换行符。另外,我们+1字符串的长度,因为我们想为空终止腾出空间。
https://stackoverflow.com/questions/1044334
复制相似问题