2013-04-25 15 views
5

Próbuję zapoznać się z celem C, a moim obecnym celem jest odczytanie listy elementów w pliku tekstowym i zapisanie ich w tablicy NSString.Czytanie z pliku tekstowego - Cel C

Obecnie jest to, co mam:

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

Nie jestem pewien, czy to sprawy, ale myList.txt jest w moim plików pomocniczych.

W tej chwili mam tylko jedną pozycję z mojej listy. Jednak nie mogę przechowywać nawet tego 1 elementu w moim listArray.

Jestem pewien, że to jest coś, głupie, że mi brakuje, jestem po prostu nowy do Objective C

EDIT: przepraszam za nie wspomnieć o tym wcześniej. NIE otrzymuję żadnego błędu. Moja tablica ma wartość zerową.

+0

ty otrzymuję błąd? – gaige

+0

Przepraszam, że zapomniałem o tym wspomnieć. Nie otrzymuję błędu, moja tablica ma wartość zerową. Później chcę trochę porównać z tablicą załadowanych elementów listy. – Johnrad

+0

Czy Twój plik "myList.txt" znajduje się w sekcji "Kopiuj zasoby pakietowe" w fazie budowania? (Kliknij cel swojej aplikacji w głównym widoku projektu.) –

Odpowiedz

24

Mam zamiar zasugerować małe uproszczenie, które może rozwiązać twój problem, ponieważ nie mogę powiedzieć, jaki jest twój problem. Z informacji nie jestem pewien, czy otrzymujesz właściwą zawartość pliku podczas czytania go lub nie.

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

Kakao wymaga sprawdzenia bezpośredniej wartości zwracanej przed użyciem 'NSError', a nie tego, czy błąd ma wartość' nil'. Błąd jest [gwarantowany] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW1) na zachowuj ważność, jeśli metoda wskazuje na niepowodzenie, ale odwrotnie - że będzie "zero" dla sukcesu - nie jest gwarantowana, nawet jeśli wcześniej została ustawiona na 'nil'. –

+1

Josh, to, co napisałeś, jest dokładne, ale zauważysz, że po prostu wyplułem wiadomość, gdy odzyskasz 'NSError'. Nie próbowałem określić sukcesu lub niepowodzenia połączenia i nie zmodyfikowałem przepływu mojego kodu w oparciu o wyniki kontroli. Ja bym użył 'if (fileContents == nil && error)' jeśli chciałem sprawdzić stan błędu. To powiedziawszy, wydaje się rozsądne podkreślenie rozróżnienia dla kogoś, kto może przekonwertować 'if' na sprawdzenie sukcesu, nie zdając sobie sprawy z implikacji. – DBD

+0

Ścieżka filePath powinna być pisana małymi literami (ścieżka do pliku) w stringWithContentsOfFile ^^ – user2070775

1

Jeśli zawartość pliku jest tak jak:

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

spróbować tej

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