使用for..in逐行读取文件

时间:2014-01-30 14:52:37

标签: objective-c arrays cocoa for-in-loop fast-enumeration

我正在尝试使用Objective-C从外部txt文件(大约180kb)逐个读取行。我在这里找到了这段代码。我理解它的方式这个代码会将每一行都放在一个元素中吗?

- (IBAction)start:(id)sender; {
    NSString *fh = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];
    for (NSArray *line in [fh componentsSeparatedByString:@"\n"]) {
        NSLog(@"output= %@",line[5]);
    }
}

我尝试通过在输出中打印一行来检查它是否正常工作但没有任何反应,我在这里做错了什么?

谢谢,

更新: 我提出了建议的更改,因为它的投票率确实为零。如果我把一个字符串包含一段文本文件(包括一些\ n),它可以正常工作。我检查了文件路径,但这似乎没问题,所以现在的问题是如何来fh = nil?

NSString *fh = [NSString stringWithContentsOfFile:@"file:///Users/Mubanga/Documents/Blender/rough2.txt" encoding:NSUTF8StringEncoding error:nil];
if([fh length] == 0) {
    NSLog(@"fh=nil");
}
for (NSString *line in [fh componentsSeparatedByString:@"\n"]) {
    NSLog(@"output= %@",line);
    }

}

3 个答案:

答案 0 :(得分:3)

循环应该是:

for (NSString *line in [fh componentsSeparatedByString:@"\n"]) {
    NSLog(@"output= %@",line);
}

line将为NSString,输出应为line,而不是line[5]

答案 1 :(得分:3)

除了@ trojanfoe的回答所需的更改,您的fh还是nil 因为路径错了。 stringWithContentsOfFile:期望一条简单的道路,而不是 文件URL。它应该是:

 NSString *fh = [NSString stringWithContentsOfFile:@"/Users/Mubanga/Documents/Blender/rough2.txt" encoding:NSUTF8StringEncoding error:nil];

通常,您应该使用错误参数:

NSError *error;
NSString *fh = [NSString stringWithContentsOfFile:@"/Users/Mubanga/Documents/Blender/rough2.txt"
                                         encoding:NSUTF8StringEncoding
                                            error:&error];
if (fh == nil) {
    NSLog(@"Could not read file: %@", error);
} else {
    // ...
}

答案 2 :(得分:1)

我会使用本机C调用手动输入字符。只需read()进入char[] buffer,直到您按下换行符,然后处理缓冲区。不,我不会为您编写代码,请查看仍然相关的K&R