Iphone NSString读取/写入文件

Iphone NSString读取/写入文件,iphone,objective-c,cocos2d-iphone,Iphone,Objective C,Cocos2d Iphone,我只是在读写iphone上的dat文件时遇到了麻烦 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *saveFile = [documentsDirectory stringByAppendingPath

我只是在读写iphone上的dat文件时遇到了麻烦

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

  }
NSArray*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory=[paths objectAtIndex:0];
NSString*saveFile=[DocumentsDirectoryStringByAppendingPathComponent:@“Profiles.dat”];
布尔值saveFileExists=[[NSFileManager defaultManager]fileExistsAtPath:saveFile];
//NSString*saveFile=[DocumentsDirectoryStringByAppendingPathComponent:@“Profiles.dat”];
NSMutableData*游戏数据;
nskeyedunachiver*解码器;
NSKeyedArchiver*编码器;
//解码器=[[NSKeyedUnarchiver alloc]initForWritingWithMutableData:gameData];
myGameState*gameState=[myGameState sharedMySingleton];
if(saveFileExists){
gameData=[NSData dataWithContentsOfFile:saveFile];
解码器=[[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”];
[解码器释放];
}
否则{
gameData=[NSMutableData];
encoder=[[NSKeyedArchiver alloc]initForWritingWithMutableData:gameData];
gameState.Profile1=@“Default1”;
gameState.Profile2=@“Default2”;
gameState.Profile3=@“Default3”;
gameState.Profile4=@“Default4”;
gameState.Profile5=@“Default5”;
[编码器编码对象:@“Default1”forKey:@“Name1”];
[编码器编码对象:@“Default2”forKey:@“Name2”];
[编码器编码对象:@“Default3”forKey:@“Name3”];
[编码器编码对象:@“Default4”forKey:@“Name4”];
[编码器编码对象:@“Default5”forKey:@“Name5”];
gameState.curProfile=gameState.Profile1;
[编码器编码对象:gameState.curProfile forKey:@“curProfile”];
[编码器编码];
//[游戏数据写入文件:原子:
[gameData WriteFile:自动保存文件:是];
//[gameData writeToFile:自动保存文件:无编码:NSStringEncodingConversionLowlossy错误:nil];
[编码器释放];
}
gameState.curProfile等都是NSString指针。现在我对Objective C非常陌生,似乎无法正确运行。我在论坛上搜索过,似乎找不到正确的方法。实际上,我只想读一个NSString并将其写入dat文件,但它无法正常工作。我已经成功地在没有问题,只是我自己无法克服课文问题。 谢谢你的帮助 谢谢
g

您的代码在这里工作没有任何问题。我猜您在代码的其他部分有问题

顺便说一下,如果您只需要保存一些条目,您不必自己完成所有这些工作;只需使用
NSUserDefaults
。它会自动准备文件以保存数据,对数据进行编码,并在下次启动时解码数据。请参阅。它可以用作

 [[NSUserDefaults standardUserDefaults] setString:@"boo" forKey:@"key!"];
之后,数据可以作为

 NSString* s=[[NSUserDefaults standardUserDefaults] stringForKey:@"key!"];
就这么简单!你可能想打个电话

[[NSUserDefaults standardUserDefaults] synchronize];

强制将数据保存到文件中;通常不需要这样做(退出时系统会自动执行此操作,等等)

发现我做错了什么。我应该使用NSMutableString,因为我后来在更改东西,所以你是对的,上面的代码只是又一个noob错误。为这个链接干杯,它将在将来为我节省大量时间。我想当我这样做时,必须有一个更简单的方法:p再次感谢g