Подсчитать количество новых строк в файле - PullRequest
3 голосов
/ 25 сентября 2010

Какой наименьший код я могу использовать для подсчета количества вхождений символа новой строки в файле с touch-c / cocoa touch?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 26 сентября 2010

Оба других ответа верны, но с оговоркой, что для работы им требуется загрузка всего файла в память.

Способ обойти загрузку файла постепенно, используя NSFileHandle. Примерно так:

NSFileHandle * file = [NSFileHandle fileHandleForReadingAtPath:pathToFile];
NSUInteger chunkSize = 1024;
NSData * chunk = [file readDataOfLength:chunkSize];
NSUInteger numberOfNewlines = 0;
while ([chunk length] > 0) {
  const unichar * bytes = (const unichar *)[chunk bytes];
  for (int index = 0; index < [chunk length]; ++index) {
    unichar character = (unichar)bytes[index];
    if ([[NSCharacterSet newlineCharacterSet] characterIsMember:character]) {
      numberOfNewlines++;
    }
  }
  chunk = [file readDataOfLength:chunkSize];
}
3 голосов
/ 25 сентября 2010

Это должно помочь вам:

NSString *fileContents = [NSString stringWithContentsOfFile:file encoding:encoding error:&error];
NSUInteger newlineCount = [fileContents numberOfOccurrencesOfString:@"\n"];

@interface NSString ()

- (NSUInteger)numberOfOccurrencesOfString:(NSString *)aString;
- (NSUInteger)numberOfOccurrencesOfChar:(char)aChar;

@end

@implementation NSString ()

- (NSUInteger)numberOfOccurrencesOfString:(NSString *)aString {
    NSRange range = [self rangeOfString:aString];
    NSUInteger length = [self length];
    NSUInteger count = 0;
    while (range.location != NSNotFound) {
        range = [self rangeOfString:aString options:0 range:NSMakeRange(range.location + range.length, length - range.location - range.length)];
        count++;
    }
    return count;
}

- (NSUInteger)numberOfOccurrencesOfChar:(char)aChar {
    const char *cString = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSUInteger stringLength = strlen(cString);
    NSUInteger count = 0;
    for (int i = 0; i < stringLength; i++) {
        if (cString[i] == aChar) {
            count++;
        }
    }
    return count;
}

@end

Пока «numberOfOccurferencesOfString:» не выделяет дополнительную память и поддерживает строковые иглы, «numberOfOccurferencesOfChar:» выделяет автоматически выпущенную копию строки NSString и выполняет поиск одного символа. ""

Поскольку вы просили подсчет новых строк (отсюда и отдельных символов), я подумал, что быстрый тест может быть полезен для этой конкретной цели: Поэтому я взял тестовую строку длиной 2486813, содержащую всего 78312 '\ n'. (Я в основном взял вариант файла слов OSX) и… … Побежал [testString numberOfOccurferencesOfString: @ "\ n"] 100 раз: 19,35 с … Побежал [testString numberOfOccurferencesOfChar: '\ n'] 100 раз: 6,91 с (Настройка: 2,2 ГГц Core 2 Duo MacBook Pro, работающий в одном потоке)

[Редактировать: исправлена ​​небольшая ошибка; сделал второй фрагмент метода строки категории.]

0 голосов
/ 13 февраля 2013

Если вы хотите остаться в Cocoa / CocoaTouch, вы можете использовать NSRegularExpression для этого:

NSString *theString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\n" options:NSRegularExpressionCaseInsensitive error:&error];
NSUInteger numLines = [regex numberOfMatchesInString:theString options:0 range:NSMakeRange(0, [theString length])] + 1;
0 голосов
/ 26 сентября 2010

маленький ты говоришь?Это автоматически превращает этот вопрос в код гольф

FILE*f=fopen(path,"r");
int i,c;
while(1+c)i+=(c=fgetc(f))==10;
printf("%i",i);

(пожалуйста, никогда не используйте этот код)

0 голосов
/ 25 сентября 2010

Вы можете сканировать строку, используя SubstringWithRange:

Подсчитайте, сколько раз появляется \ n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...