目标-C:逐行读取文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

目标C中处理大文本文件的适当方法是什么?假设我需要分别阅读每一行,并希望将每一行视为NSString。最有效的方法是什么?

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

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

然后用换行符分隔行,然后迭代数组中的元素。然而,这似乎相当低效。有没有一种简单的方法可以将文件作为一个流来处理,对每一行进行枚举,而不是一次读取全部文件?有点像Java的java.io.BufferedReader。

提问于
用户回答回答于

NSInputStream允许读取N个字节块(非常类似于java.io.BufferedReader),但您必须将其转换为NSString然后扫描换行符(或任何其他分隔符),保存剩余的字符以供下次读取,如果换行符尚未读取,则读取更多字符。NSFileHandle让你读到NSData,然后可以将其转换为NSString,但本质上是相同的过程。)

如果您要频繁地读取这样的字符串(特别是在程序的不同部分),最好将这种行为封装在一个可以为您处理细节的类中,甚至可以将其子类化。NSInputStream.

用户回答回答于

比如说你读了一个文本文件。

NSString* filePath = @""//file path...
NSString* fileRoot = [[NSBundle mainBundle] 
               pathForResource:filePath ofType:@"txt"];

你想摆脱新的防线。

// read everything from text
NSString* fileContents = 
      [NSString stringWithContentsOfFile:fileRoot 
       encoding:NSUTF8StringEncoding error:nil];

// first, separate by new line
NSArray* 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:@";"]];

扫码关注云+社区