NSScanner - сканировать следующую строку в строку - PullRequest
1 голос
/ 21 июня 2009

Я работаю с NSScanner для анализа данных, которые разделены запятой и строкой. Это было довольно просто реализовать, но я столкнулся с очень простой проблемой. Я хотел бы просканировать следующую строку, даже если она пуста. Проблема, с которой я столкнулся сейчас, заключается в том, что если есть пустая строка, она пропустит ее и прочитает следующую строку. Тогда мой анализ отключен, потому что неправильные данные оказались в неправильном месте. Вот код, который у меня есть сейчас:

NSCharacterSet *setToIgnore = [NSCharacterSet characterSetWithCharactersInString:@",\r\n"];
[scanner setCharactersToBeSkipped:setToIgnore];

NSInteger levelID, campaignID;
NSString *title, *about, *gameBoard;
BOOL aTest = [scanner scanInteger:&levelID] && [scanner scanInteger:&campaignID];
aTest = [scanner scanUpToString:@"\r\n" intoString:&title];
aTest = [scanner scanUpToString:@"\r\n" intoString:&about];
aTest = [scanner scanUpToString:@"\r\n" intoString:&gameBoard];

Итак, данные отформатированы так: INT, INT строка строка строка

Иногда вторая строка (about) пуста, и NSScanner пропускает ее и считывает строку gameBoard в about. Как мне сказать NSScanner прочитать в следующей строке?

Ответы [ 2 ]

2 голосов
/ 21 июня 2009

Решение 1. Удалите операторы setToIgnore и отсканируйте вручную разделители:

NSInteger levelID, campaignID;
NSString *title, *about, *gameBoard;
BOOL aTest = [scanner scanInteger:&levelID]

[scanner setScanLocation:[scanner scanLocation]+1]; // skip comma
aTest=[scanner scanInteger:&campaignID];
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break
aTest = [scanner scanUpToString:@"\r\n" intoString:&title];
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break
aTest = [scanner scanUpToString:@"\r\n" intoString:&about];
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break
aTest = [scanner scanUpToString:@"\r\n" intoString:&gameBoard];
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break

Решение 2: Заменить всю партию на:

NSArray *lines=[file componentsSeparatedByString:@"\r\n"];

А затем переберите и проанализируйте строки по отдельности.

1 голос
/ 21 июня 2009

Не игнорируйте \r и \n.

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