2013-04-25 21 views
5

Sto cercando di familiarizzare con l'obiettivo C, e il mio obiettivo attuale è quello di leggere un elenco di elementi in un file di testo e memorizzarli in un array NSString.Lettura dal file di testo - Obiettivo C

Attualmente questo è quello che ho:

NSString *filepath = [[NSBundle mainBundle] pathForResource:@"myList" ofType:@"txt"]; 
NSData* data = [NSData dataWithContentsOfFile:filepath]; 
NSString* string = [[NSString alloc] initWithBytes:[data bytes] 
              length:[data length] 
              encoding:NSUTF8StringEncoding]; 

NSString* delimiter = @"\n"; 
listArray = [string componentsSeparatedByString:delimiter]; 

Io non sono sicuro se questo importa, ma myList.txt è nel mio file di supporto.

Al momento, ho solo un elemento nella mia lista. Tuttavia non sono in grado di memorizzare anche 1 elemento nel mio listArray.

Sono sicuro che è qualcosa di stupido che mi manca, io sono solo una novità per Objective C.

EDIT: Mi scuso per non menzionare questo in precedenza. NON sto ricevendo alcun tipo di errore. Il mio array è solo nullo.

+0

stai ricevendo un errore? – gaige

+0

Scusa se ho dimenticato di dirlo. Non ricevo un errore, il mio array è solo nullo. Più tardi voglio fare un po 'di confronto con la matrice di elementi della lista caricati. – Johnrad

+0

Il tuo file "myList.txt" è elencato nella sezione delle risorse del pacchetto copia della tua fase di costruzione? (Fai clic sul target della tua app nella vista principale del progetto.) –

risposta

24

Ho intenzione di suggerire una piccola semplificazione che potrebbe risolvere il tuo problema poiché non posso dire quale sia il tuo problema. Dalle informazioni non sono sicuro se stai ottenendo il contenuto del file corretto durante la lettura o meno.

NSString *filepath = [[NSBundle mainBundle] pathForResource:@"myList" ofType:@"txt"]; 
NSError *error; 
NSString *fileContents = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:&error]; 

if (error) 
    NSLog(@"Error reading file: %@", error.localizedDescription); 

// maybe for debugging... 
NSLog(@"contents: %@", fileContents); 

NSArray *listArray = [fileContents componentsSeparatedByString:@"\n"]; 
NSLog(@"items = %d", [listArray count]); 
+1

Cocoa richiede di controllare il valore di ritorno diretto prima di utilizzare 'NSError', non se l'errore è' nil'. L'errore è [garantito] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW1) a essere valido se il metodo indica un errore, ma il contrario - che sarà "nullo" per il successo - è _non_ garantito, anche se lo si imposta a 'nil' in anticipo. –

+1

Josh, quello che hai scritto è accurato, ma noterai che sputo appena fuori il messaggio se ho ottenuto un 'NSError' indietro. Non stavo cercando di determinare il successo o il fallimento della chiamata e non ho modificato il mio flusso di codice in base ai risultati del controllo. Avrei usato 'if (fileContents == nil && error)' se intendevo controllare lo stato di errore. Detto questo, sembra ragionevole evidenziare la distinzione per qualcuno che potrebbe convertire il "se" in un controllo di successo senza rendersene conto. – DBD

+0

filePath deve essere in minuscolo (percorso file) in stringWithContentsOfFile ^^ – user2070775

1

Se il contenuto del file è come:

[{"Title":"20","Cost":"20","Desc":""},{"Title":"10","Cost":"10.00","Desc":""},{"Title":"5","Cost":"5.00","Desc":""}] 

provare questo

-(id)readFromDocumentDBFolderPath:(NSString *)fileName 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    NSFileManager *fileManager=[NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:appFile]) 
    { 
     NSError *error= NULL; 
     NSData* data = [NSData dataWithContentsOfFile:appFile]; 
     id resultData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
     if (error == NULL) 
     { 
      return resultData; 
     } 
    } 
    return NULL; 
}