2010-08-02 6 views
-1

아이폰의 dat 파일에 NSString을 읽고 쓰는 데 문제가 있습니다.NSString 파일 읽기/쓰기

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 등은 모두 NSString 포인터입니다. 이제 목표 C에 대해 매우 새로운 것이고 제대로 작동하지 않는 것 같습니다. 나는 포럼 주위를 수색하고 이것을 기울이는 올바른 방법을 찾을 수 없습니다. 문자 그대로 내가 원하는 것은 dat 파일에 NSString을 쓰는 것입니다. 그러나 그것은 작동하지 않습니다. 나는 ints와 bool을 아무런 문제없이 쓸 수 있었지만, 스스로 문제는 해결할 수 없었다. 도움이 되셨습니다. 감사합니다. g

답변

1

코드는 아무런 문제없이 작동합니다. 나는 당신이 다른 부분의 코드에 문제가 있다고 생각합니다.

그런데 몇 가지 항목 만 저장해야하는 경우 이러한 모든 작업을 직접 수행 할 필요가 없습니다. 그냥 NSUserDefaults을 사용하세요. 자동으로 파일을 저장하여 데이터를 저장하고, 데이터를 인코딩하고, 다음 실행시 데이터를 디코딩합니다. this Apple document을 참조하십시오. 그것은

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

로 사용할 수 있으며, 그것은이처럼 쉽게

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

로 나중에 데이터를 읽을 수 있습니다!

[[NSUserDefaults standardUserDefaults] synchronize]; 

으로 전화를 걸어 강제로 데이터를 파일에 저장할 수 있습니다. 대개 이것은 필요하지 않습니다 (시스템이 종료 할 때 자동으로이 작업을 수행합니다.)

+0

내가 잘못하고있는 것을 발견했습니다. 나중에 NSMutableString을 사용해야 했으므로 코드를 위의 코드가 멍청한 또 다른 실수를 저지른 것처럼 바꿨습니다. 그리고 그 링크에 대한 환호는 저에게 시간 낭비를 덜어 줄 것입니다. 나는 그 일을 할 때 더 쉬운 방법이 있어야한다고 생각했습니다. P 다시 감사드립니다. g – glogic