2014-01-30 103 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