2009-12-10 5 views
1

Je pense que je suis un peu confus ici, ce que j'ai est un fichier texte avec les chiffres "5 10 2350" dedans. Comme vous pouvez le voir ci-dessous, j'essaie de lire la première valeur en utilisant readDataOfLength, je pense que peut-être que je devrais être en train de lire comme caractères, mais alors 10 est 2 caractères et 2350 est 4. Quelqu'un peut-il pointer m dans le bonne direction à lire ces.Lecture des données de 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

deux excellentes réponses de Jarret et Ole, voici ce que je suis allé avec. Une dernière question "METHODE 02" récupère un retour chariot vers une ligne vide au bas du fichier texte, le renvoie sous forme de sous-chaîne, qui à son tour est convertie en "0" puis-je régler le NSCharacterSet pour arrêter cela, actuellement je vient d'ajouter une vérification de longueur sur la chaîne.

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]); 
    } 
} 

gary

+0

Hmmm .... Je ne peux pas sembler dupliquer le 0 final dans la méthode 02 avec juste des sauts de ligne ... Je peux, cependant, si je mets un non-chiffre caractère à la fin. –

+0

Peut-être qu'il y avait quelque chose qui se cachait dans mon fichier de test que je ramassais. Merci d'avoir regardé de toute façon. – fuzzygoat

Répondre

4

Il y a plusieurs commodités à Cocoa qui peuvent vous rendre la vie un peu plus facile ici:

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); 
    } 
} 

Sinon, en utilisant votre approche originale, vous auriez à peu près avoir à lire caractère par caractère, en ajoutant chaque caractère à un "tampon", puis en évaluant votre entier lorsque vous rencontrez un espace (ou une nouvelle ligne, ou un autre séparateur).

3

Si vous lisez le contenu du fichier dans une chaîne comme Jaret suggested, et en supposant que la chaîne ne contient que des chiffres et des espaces, vous pouvez aussi appeler:

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

Cela diviser la chaîne à des espaces et des sauts de ligne et retour un tableau des sous-chaînes. Vous devrez alors convertir les sous-chaînes en entiers en faisant une boucle sur le tableau et en appelant [substring integerValue].

+0

une approche agréable et simple –

+0

Selon votre cas d'utilisation, cela peut être très lent. L'utilisation de NSScanner (comme indiqué ci-dessus) sera d'un ordre de grandeur plus rapide que cette méthode de tableau. Mais cela ne vous importera peut-être pas. – walkingbrad

0

Une façon de le faire serait première-première transformer votre ReadBuffer en une chaîne comme suit:

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

Puis diviser la chaîne en valeurs:

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); 
} 

La sortie de c'est

5 
10 
2350