Objective-C:逐行读取文件

Objective-C:逐行读取文件

在Objective-C中处理大型文本文件的适当方法是什么?假设我需要分别读取每一行,并希望将每一行视为NSString。这样做最有效的方法是什么?

一种解决方案是使用NSString方法:

+ (id)stringWithContentsOfFile:(NSString *)path 
      encoding:(NSStringEncoding)enc 
      error:(NSError **)error

然后使用换行符分隔符拆分行,然后遍历数组中的元素。但是,这似乎效率很低。有没有简单的方法将文件视为一个流,枚举每一行,而不是一次只读取它?有点像Java的java.io.BufferedReader。


FFIVE
浏览 1618回答 3
3回答

MMMHUHU

这将一般阅读一个工作String的Text。如果你想阅读更长的文本(大文本),那么使用其他人提到的方法,如缓冲(保留内存空间中文本的大小)。假设你读了一个文本文件。NSString* filePath = @""//file path...NSString* fileRoot = [[NSBundle mainBundle]                 pathForResource:filePath ofType:@"txt"];你想摆脱新的路线。// read everything from textNSString* fileContents =        [NSString stringWithContentsOfFile:fileRoot         encoding:NSUTF8StringEncoding error:nil];// first, separate by new lineNSArray* allLinedStrings =        [fileContents componentsSeparatedByCharactersInSet:       [NSCharacterSet newlineCharacterSet]];// then break down even further NSString* strsInOneLine =        [allLinedStrings objectAtIndex:0];// choose whatever input identity you have decided. in this case ;NSArray* singleStrs =        [currentPointString componentsSeparatedByCharactersInSet:       [NSCharacterSet characterSetWithCharactersInString:@";"]];你有它。

慕桂英546537

这应该做的伎俩:#include&nbsp;<stdio.h>NSString&nbsp;*readLineAsNSString(FILE&nbsp;*file){ &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buffer[4096]; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;tune&nbsp;this&nbsp;capacity&nbsp;to&nbsp;your&nbsp;liking&nbsp;--&nbsp;larger&nbsp;buffer&nbsp;sizes&nbsp;will&nbsp;be&nbsp;faster,&nbsp;but &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;more&nbsp;memory &nbsp;&nbsp;&nbsp;&nbsp;NSMutableString&nbsp;*result&nbsp;=&nbsp;[NSMutableString&nbsp;stringWithCapacity:256]; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Read&nbsp;up&nbsp;to&nbsp;4095&nbsp;non-newline&nbsp;characters,&nbsp;then&nbsp;read&nbsp;and&nbsp;discard&nbsp;the&nbsp;newline &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;charsRead; &nbsp;&nbsp;&nbsp;&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fscanf(file,&nbsp;"%4095[^\n]%n%*c",&nbsp;buffer,&nbsp;&charsRead)&nbsp;==&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[result&nbsp;appendFormat:@"%s",&nbsp;buffer]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while(charsRead&nbsp;==&nbsp;4095); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}使用方法如下:FILE&nbsp;*file&nbsp;=&nbsp;fopen("myfile",&nbsp;"r");//&nbsp;check&nbsp;for&nbsp;NULLwhile(!feof(file)){ &nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*line&nbsp;=&nbsp;readLineAsNSString(file); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;stuff&nbsp;with&nbsp;line;&nbsp;line&nbsp;is&nbsp;autoreleased,&nbsp;so&nbsp;you&nbsp;should&nbsp;NOT&nbsp;release&nbsp;it&nbsp;(unless&nbsp;you&nbsp;also&nbsp;retain&nbsp;it&nbsp;beforehand)}fclose(file);此代码从文件中读取非换行符,一次最多4095个。如果您的行长度超过4095个字符,则会一直读取,直到它到达换行符或文件结尾。注意:我没有测试过这段代码。请在使用前进行测试。
打开App,查看更多内容
随时随地看视频慕课网APP