我有一个“写入”按钮,它接受Textfild中的任何内容,并附加到指定的文件。我还有一个“读取”按钮,它从指定文件的内容中读取,并在屏幕上显示。 “Write”按钮调用writeDataToFile:(id)sender,“Read”按钮调用readDataFromFile:(id)sender。
问题是以下简单代码在iPhone 6.1 Simulator(Xcode 4.6.2)上运行正常,但在读取设备中不显示任何内容,例如带有iOS 6.1.3的iPod。
我怀疑问题与编码有关:NSUTF8StringEncoding。但是,我尝试了NSUTF16StringEncoding和NSUTF32StringEncoding,它仍然无法在真实设备上工作(但在模拟器上显示乱码)。
我哪里做错了?如果有人能给我一些指示,我将非常感激。
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [documentPaths objectAtIndex:0];
_fileName = [documentsDirectory stringByAppendingPathComponent:@"data.txt"];
}
- (IBAction)writeDataToFile:(id)sender {
NSString *str = tfData.text;
str = [str stringByAppendingFormat:@"\n"];
_fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:_fileName];
[_fileHandle seekToEndOfFile];
//convert NSString to NSData
[_fileHandle writeData: [str dataUsingEncoding:NSUTF8StringEncoding]];
[_fileHandle closeFile];
[tfData resignFirstResponder];
}
- (IBAction)readDataFromFile:(id)sender {
[tfData resignFirstResponder];
//lbOut is a UILabel
lbOut.text = [NSString stringWithContentsOfFile:_fileName encoding:NSUTF8StringEncoding error:NULL];
}
答案 0 :(得分:0)
尝试从中读取时,尝试诊断该文件是否存在。您可以使用NSFileManager
执行此操作。还要检查文件是否具有正确的大小(或至少非零大小)。
另外,您是否检查过stringWithContentsOfFile
是否实际返回字符串?如果发生错误,它将返回nil
并且不会引发异常。如果您获得nil
,则可以将NSError
对象传递给stringWithContentsOfFile
,它会让您知道出了什么问题。
答案 1 :(得分:0)
首先检查您的返回值。如果我不得不猜测,我会说_fileName
处的文件不存在。如果文件不存在fileHandleForUpdatingAtPath:
将返回nil。并且对fileHandle的每次后续调用都将以静默方式失败。
因此,您应该检查fileHandleForUpdatingAtPath:
是否实际返回了一个fileHandle。如果没有,请使用fileHandleForWritingAtPath:
创建fileHandle。
以类似的方式,您应该检查转换为NSData是否失败。我使用NSParameterAssert
,如果stringData为nil会导致应用程序崩溃,因为我认为无法从失败的NSString转换中恢复。如果您认为有一种方法可以从此错误中恢复,请使用NSParameterAssert
语句替换if (!stringData)
。
_fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:_fileName];
if (!_fileHandle) {
NSLog(@"File does not exist at path \"%@\". Create it.", _fileName);
_fileHandle = [NSFileHandle fileHandleForWritingAtPath:_fileName];
}
// should have a valid fileHandle here
[_fileHandle seekToEndOfFile];
NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding];
NSParameterAssert(stringData); // will raise an exception if stringData is nil
[_fileHandle writeData:stringData];
答案 2 :(得分:0)
我发现了问题。问题在于_fileHandle的绑定。我声明了这个公共变量,并将它与一个与我打算使用的文件相关联的NSFileHandle绑定 [NSFileHandle fileHandleForWritingAtPath:_fileName]。我打算继续使用来自不同ViewControllers的_fileHandle,而不需要每次使用它时都将它与文件绑定。它导致我描述的问题(即,在模拟器上工作正常,但在真实设备上没有)。
每次使用它时,我都会使用NSFileHandle初始化重新绑定_fileHandle,现在它可以正常工作。