1

我有一个“写入”按钮,它接受 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];
}
4

3 回答 3

0

当您尝试从中读取文件时,尝试诊断该文件是否存在。您可以使用NSFileManager. 还要检查文件是否具有正确的大小(或至少是非零大小)。

另外,您是否检查过是否stringWithContentsOfFile实际返回一个字符串?如果发生错误,它将返回nil并且不会引发异常。如果你得到nil你可以传递一个NSError对象stringWithContentsOfFile,它会让你知道出了什么问题。

于 2013-06-22T17:37:14.583 回答
0

首先检查您的返回值。如果我不得不猜测,我会说该文件_fileName不存在。如果文件不存在fileHandleForUpdatingAtPath:将返回 nil。并且对 fileHandle 的每个后续调用都将静默失败。

所以你应该检查是否fileHandleForUpdatingAtPath:真的返回了一个文件句柄。如果没有,请使用fileHandleForWritingAtPath:.

以类似的方式,您应该检查到 NSData 的转换是否失败。我使用NSParameterAssert了 ,如果 stringData 为 nil,它将使您的应用程序崩溃,因为我认为无法从失败的 NSString 转换中恢复。如果您认为有办法从该错误中恢复,请将 替换NSParameterAssertif (!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];
于 2013-06-22T17:47:56.197 回答
0

我发现了问题。问题在于 _fileHandle 的绑定。我声明了这个公共变量,并将它与一个 NSFileHandle 绑定,该 NSFileHandle 与我打算使用 [NSFileHandle fileHandleForWritingAtPath:_fileName] 编写的文件相关联。我打算继续使用来自不同 ViewController 的 _fileHandle,而无需每次使用时都将其与文件绑定。它导致了我描述的问题(即,在模拟器上工作正常,但在真实设备上却不行)。

一旦我每次使用 _fileHandle 和 NSFileHandle 初始化重新绑定它,它现在就可以正常工作了。

于 2013-06-30T15:00:41.300 回答