从文件中读取适用于iPhone 6.1 Simulator,但不适用于iPhone设备(iOS 6.1.3)

时间:2013-06-22 16:39:15

标签: ios

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

3 个答案:

答案 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,现在它可以正常工作。