2010-08-02 11 views
-1

J'ai juste du mal à lire et à écrire NSString dans un fichier de données sur l'iphone.NSString lire/écrire dans le fichier

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *saveFile = [documentsDirectory stringByAppendingPathComponent:@"Profiles.dat"]; 
    Boolean saveFileExists = [[NSFileManager defaultManager] fileExistsAtPath:saveFile]; 

    // NSString *saveFile = [documentsDirectory stringByAppendingPathComponent:@"Profiles.dat"]; 


    NSMutableData *gameData; 
    NSKeyedUnarchiver *decoder; 

    NSKeyedArchiver *encoder; 

    //decoder = [[NSKeyedUnarchiver alloc] initForWritingWithMutableData:gameData]; 

    myGameState *gameState = [myGameState sharedMySingleton]; 


    if(saveFileExists) { 
    gameData = [NSData dataWithContentsOfFile:saveFile]; 
    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:gameData]; 

    gameState.Profile1 = [decoder decodeObjectForKey:@"Name1"]; 
    gameState.Profile2 = [decoder decodeObjectForKey:@"Name2"]; 
    gameState.Profile3 = [decoder decodeObjectForKey:@"Name3"]; 
    gameState.Profile4 = [decoder decodeObjectForKey:@"Name4"]; 
    gameState.Profile5 = [decoder decodeObjectForKey:@"Name5"]; 

    gameState.curProfile = [decoder decodeObjectForKey:@"curProfile"]; 
    [decoder release]; 


    } 
    else { 
    gameData = [NSMutableData data]; 
    encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:gameData]; 
    gameState.Profile1 = @"Default1"; 
    gameState.Profile2 = @"Default2"; 
    gameState.Profile3 = @"Default3"; 
    gameState.Profile4 = @"Default4"; 
    gameState.Profile5 = @"Default5"; 

    [encoder encodeObject:@"Default1" forKey:@"Name1"]; 
    [encoder encodeObject:@"Default2" forKey:@"Name2"]; 
    [encoder encodeObject:@"Default3" forKey:@"Name3"]; 
    [encoder encodeObject:@"Default4" forKey:@"Name4"]; 
    [encoder encodeObject:@"Default5" forKey:@"Name5"]; 

    gameState.curProfile = gameState.Profile1; 
    [encoder encodeObject:gameState.curProfile forKey:@"curProfile"]; 

    [encoder finishEncoding]; 
    //[gameData writeToFile:<#(NSString *)path#> atomically:<#(BOOL)useAuxiliaryFile#> 
    [gameData writeToFile:saveFile atomically:YES ]; 
    //[gameData writeToFile:saveFile atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; 

    [encoder release]; 

    } 

gameState.curProfile etc sont tous des pointeurs NSString. Maintenant, je suis très nouveau à l'objectif C et ne peux tout simplement pas sembler fonctionner correctement. J'ai cherché autour des forums et ne peux pas sembler trouver la bonne manière de faire ceci. Littéralement tout ce que je veux est de lire un NSString dans un fichier dat mais il ne fonctionne pas comme il est. J'ai réussi à écrire des ints et des bools sans problèmes, je n'arrive pas à résoudre le problème du texte par moi-même. toute aide est appréciée merci g

Répondre

1

Votre code fonctionne sans aucun problème ici. Je suppose que vous avez des problèmes dans d'autres parties des codes. D'ailleurs, si vous avez seulement besoin d'enregistrer quelques entrées, vous n'avez pas besoin de faire tous ces travaux vous-même; il suffit d'utiliser NSUserDefaults. Il prépare automatiquement le fichier pour enregistrer les données, encode les données et décode les données au prochain lancement. Voir this Apple document. Il peut être utilisé comme

[[NSUserDefaults standardUserDefaults] setString:@"boo" forKey:@"key!"]; 

et plus tard, les données peuvent être lues comme

NSString* s=[[NSUserDefaults standardUserDefaults] stringForKey:@"key!"]; 

Il est aussi simple que cela! Vous pouvez appeler

[[NSUserDefaults standardUserDefaults] synchronize]; 

pour forcer l'enregistrement des données dans le fichier; Habituellement, cela n'est pas nécessaire (le système le fait automatiquement quand il quitte, etc.)

+0

J'ai trouvé ce que je faisais de mal. J'aurais dû utiliser NSMutableString comme je changeais les choses plus tard donc tu avais raison que le code ci-dessus fonctionnait juste une autre erreur de noob. et acclamations pour ce lien qui va me sauver beaucoup de temps à l'avenir j'ai pensé quand je le faisais qu'il devait y avoir un moyen plus facile: P merci encore g – glogic