2014-01-30 104 views
0

我正在尝试使用Objective-C从外部txt文件(大约180kb)逐一读取行。我在这里找到了这段代码。我的理解是,这段代码会把每一行放在一个元素里吗?使用for..in逐行读取文件

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

我试图检查其是否通过打印线,以我的最大输出工作,但什么也没有发生,我究竟做错了什么?

感谢,

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

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); 
    } 

} 
+0

首先,验证FH不是零。 –

+0

@MartinR你是对的,fh竟然是零。我怎样才能防止这种情况发生? – Mubanga

+0

您可能也不想使用'fh'作为不包含NSFileHandle的变量的名称。由于它包含一个字符串,我将其命名为'string','str'或'fileContents'或类似的东西。 –

回答

3

除了@ trojanfoe的回答所需的更改外,您的fhnil ,因为路径错误。 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 { 
    // ... 
} 
+1

fh可能为零的另一个原因是该文件不是有效的UTF-8数据。检查你的文件的编码。 –

3

环路应该是:

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

line将是一个NSString和输出应为line,不line[5])。

+0

确实。 'componentsSeparatedByString:'返回一个数组,'for'循环*遍历数组*中的对象。数组中的对象是字符串 - 每个字符串是原始字符串中的一行。 –

1

我会用本地C调用手动输入字符。只需将read()转换为char[] buffer,直到您点击换行符,然后处理缓冲区。不,我不会为你写代码,查看仍然相关的K&R

+0

我必须同意。当谈到解析文件时,我仍然更喜欢标准C.使用C没有什么问题,因为Objective-C只是C的超集。 – Freddy

+1

然而,K&R居住在所有用户说英语的ASCII时代。这不再是这种情况,'NSString'比C++更适合处理非拉丁字符。 – trojanfoe