Objective-C:逐行读取文件在Objective-C中处理大型文本文件的适当方法是什么?假设我需要分别读取每一行,并希望将每一行视为NSString。这样做最有效的方法是什么?一种解决方案是使用NSString方法:+ (id)stringWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc
error:(NSError **)error然后使用换行符分隔符拆分行,然后遍历数组中的元素。但是,这似乎效率很低。有没有简单的方法将文件视为一个流,枚举每一行,而不是一次只读取它?有点像Java的java.io.BufferedReader。
3 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
这将一般阅读一个工作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
TA贡献1848条经验 获得超10个赞
这应该做的伎俩:
#include <stdio.h>NSString *readLineAsNSString(FILE *file){ char buffer[4096]; // tune this capacity to your liking -- larger buffer sizes will be faster, but // use more memory NSMutableString *result = [NSMutableString stringWithCapacity:256]; // Read up to 4095 non-newline characters, then read and discard the newline int charsRead; do { if(fscanf(file, "%4095[^\n]%n%*c", buffer, &charsRead) == 1) [result appendFormat:@"%s", buffer]; else break; } while(charsRead == 4095); return result;}
使用方法如下:
FILE *file = fopen("myfile", "r");// check for NULLwhile(!feof(file)){ NSString *line = readLineAsNSString(file); // do stuff with line; line is autoreleased, so you should NOT release it (unless you also retain it beforehand)}fclose(file);
此代码从文件中读取非换行符,一次最多4095个。如果您的行长度超过4095个字符,则会一直读取,直到它到达换行符或文件结尾。
注意:我没有测试过这段代码。请在使用前进行测试。
- 3 回答
- 0 关注
- 1617 浏览
添加回答
举报
0/150
提交
取消