2009-12-10 4 views
1

Я думаю, что я немного запутался здесь, у меня есть простой текстовый файл с цифрами «5 10 2350» в нем. Как вы можете видеть ниже, я пытаюсь прочитать первое значение с помощью readDataOfLength, я думаю, что, возможно, где я запутался, я должен читать как символы, но тогда 10 - это 2 символа, а 2350 - 4. Может ли кто-нибудь указать m в правильное направление для их чтения.Чтение ints из NSData?

NSString *dataFile_IN = @"/Users/FGX/Documents/Xcode/syntax_FileIO/inData.txt"; 
NSFileHandle *inFile; 
NSData *readBuffer; 
int intBuffer; 
int bufferSize = sizeof(int); 

inFile = [NSFileHandle fileHandleForReadingAtPath:dataFile_IN]; 
if(inFile != nil) { 
    readBuffer = [inFile readDataOfLength:bufferSize]; 
    [readBuffer getBytes: &intBuffer length: bufferSize]; 

    NSLog(@"BUFFER: %d", intBuffer); 
    [inFile closeFile]; 
} 

EDIT_001

Оба отличные ответы от Джаррет и Оле, вот что я пошел с. Один последний вопрос «METHOD 02» подбирает возврат каретки к пустой строке в нижней части текстового файла, возвращает его как подстроку, которая, в свою очередь, преобразуется в «0», я могу установить NSCharacterSet, чтобы остановить это, в настоящее время я просто добавила проверку длины строки.

NSInteger intFromFile; 
NSScanner *scanner; 
NSArray *subStrings; 
NSString *eachString; 

// METHOD 01 Output: 57 58 59 
strBuffer = [NSString stringWithContentsOfFile:dataFile_IN encoding:NSUTF8StringEncoding error:&fileError]; 
scanner = [NSScanner scannerWithString:strBuffer]; 
while ([scanner scanInteger:&intFromFile]) NSLog(@"%d", intFromFile); 


// METHOD 02 Output: 57 58 59 0 
strBuffer = [NSString stringWithContentsOfFile:dataFile_IN encoding:NSUTF8StringEncoding error:&fileError]; 
subStrings = [strBuffer componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
for(eachString in subStrings) { 
    if ([eachString length] != 0) { 
     NSLog(@"{%@} %d", eachString, [eachString intValue]); 
    } 
} 

Гэри

+0

Хммм .... Я не могу дублировать трейлинг 0 в методе 02 только с символами новой строки ... Я могу, однако, добавить я не цифру символ в конце. –

+0

Возможно, что-то скрывалось в моем тестовом файле, который я собирал. Спасибо, что смотрели в любом случае. – fuzzygoat

ответ

4

Есть несколько удобства какао, которые могут сделать вашу жизнь немного легче здесь:

NSString *dataFile_IN = @"/Users/FGX/Documents/Xcode/syntax_FileIO/inData.txt"; 

// Read all the data at once into a string... an convenience around the 
// need the open a file handle and convert NSData 
NSString *s = [NSString stringWithContentsOfFile:dataFile_IN 
             encoding:NSUTF8StringEncoding 
              error:nil]; 

// Use a scanner to loop over the file. This assumes there is nothing in 
// the file but integers separated by whitespace and newlines 
NSInteger anInteger; 
NSScanner *scanner = [NSScanner scannerWithString:s]; 
while (![scanner isAtEnd]) { 
    if ([scanner scanInteger:&anInteger]) { 
     NSLog(@"Found an integer: %d", anInteger); 
    } 
} 

В противном случае, используя свой оригинальный подход, вы в значительной степени должны читать по-символу, добавляя каждый символ в «буфер», а затем оценивая ваше целое число, когда вы сталкиваетесь с пространством (или новой линией или каким-либо другим разделителем).

3

Если прочитать содержимое файла в строку как Jaret suggested, и предполагая, что строка содержит только цифры и пробелы, вы также можете позвонить:

NSArray *substrings = [s componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Это будет разделить строку на пробелы и символы новой строки и возврата массив подстрок. Затем вам придется преобразовать подстроки в целые числа, перейдя по массиву и вызов [substring integerValue].

+0

хороший и простой подход –

+0

В зависимости от вашего варианта использования, это может быть очень медленным. Использование NSScanner (как отмечено выше) будет на порядок быстрее, чем этот метод массива. Но это может не иметь значения для вас. – walkingbrad

0

Один из способов сделать это было бы первым, чтобы первым превратить ReadBuffer в строку следующим образом:

NSString * dataString = [[NSString alloc] initWithData:readBuffer encoding:NSUTF8StringEncoding]; 

Затем разделить строку в значение:

NSString *[email protected]"5 10 2350"; // example string to split 
NSArray * valueStrings = [dataString componentsSeparatedByString:@" "]; 
for(NSString *valueString in valueStrings) 
{ 
    int value=[valueString intValue]; 
    NSLog(@"%d",value); 
} 

Выхода этого

5 
10 
2350 
Смежные вопросы