jos*_*uth -2 load file objective-c nsstring
很奇怪的问题.我一直在测试我的小命令行程序,它读取一个文件并解析它,它与我的测试数据工作正常,但是当我追求真实的东西时,它找不到文件.
原始文件是通过文本编辑放在一起的文本文件,实际文件是以MS-Dos格式从Microsoft Word保存的.当我试图读取MS Word文件时,它找不到它.我没有收到错误但是从文件加载方法中得到了一个nil字符串.然后我将我的测试文件重命名为相同的名称,它获得了原始测试数据.咦?在最坏的情况下,我认为我会看到某种奇怪的数据加载到我的字符串中......不是零.
这是代码片段的程式化部分.请忽略数据文件NSString周围的"捕获和释放"代码......我意识到我不需要这样做,这不是问题的关键.
datafilename设置为'config1.txt'.
(NSString*) OpenEntryFile: (NSString*) pathname withdatafilename: (NSString*) datafilename {
NSStringEncoding encoding;
NSError* error = nil;
NSString* inputdatafile;
NSString* response;
NSString *homeDir = NSHomeDirectory();
NSString *fullPath = [homeDir stringByAppendingPathComponent:datafilename];
filepointer = 0;
[Datafile release];
inputdatafile = [NSString stringWithContentsOfFile: fullPath usedEncoding:&encoding error:&error];
Datafile = [inputdatafile copy];
response = [NSMutableString stringWithString: @"OK"];
if (error) {response = [NSMutableString stringWithString: @"ERROR"];};
if ([Datafile length] < 60) {response = [NSMutableString stringWithString: @"SHORT"];};
return response;
}
Run Code Online (Sandbox Code Playgroud)
bbu*_*bum 28
这段代码有很多问题;
Datafile 应该 dataFile
这if(error)是错的; 只有通过检查返回值才能知道是否生成了错误.
没有必要使用NSMutableString您的回复.只需直接使用常量字符串即可.
没有必要将数据复制为读取stringWithContentsOfFile:; 只保留结果字符串(如果你得到一个).
如果你准备好nil了inputdatafile,那么就会产生一个错误.即返回的字符串不能为nil而不error包含问题的描述.
即这将始终输出字符串或错误:
if (inputdatafile)
NSLog(@"%@", inputdatafile);
else
NSLog(@"error %@", error);
Run Code Online (Sandbox Code Playgroud)
来自评论:
if ([error code]) {response = [NSMutableString stringWithString: @"ERROR"];}
Run Code Online (Sandbox Code Playgroud)
这是完全错误的.
规则是您必须在检查错误之前检查返回值.永远无例外.
否则将导致崩溃和其他错误行为.