我的程序从文件加载一些数据,然后绘制它们。
文件阅读部分是这样的:
- (void)load_file
{
NSFileHandle *inFile = [NSFileHandle fileHandleForReadingAtPath:@"map_data"];
NSData *myData=[inFile readDataToEndOfFile];
NSString *myText=[[NSString alloc]initWithData:myData encoding:NSASCIIStringEncoding];
NSArray *values = [myText componentsSeparatedByString:@"\n"];
for (NSString *string in values) {
NSArray *lines=[string componentsSeparatedByString:@" "];
if ([lines count] != 2) break;
NSPoint point= NSMakePoint([lines[0] floatValue], [lines[1] floatValue]);
[points addObject:[NSValue valueWithPoint:point]];
}
[self setNeedsDisplay:YES];
}
调试时,我把数据文件放在[NSBundle mainBundle]目录下,程序运行正常。
然而,当我使用Achie取出应用程序时,它永远不会运行。我将数据文件放在与应用程序相同的路径中,但似乎无法加载它。
更新
我尝试使用c ++,但仍然失败。
- (void)load_file
{
ifstream inf("map_data");
double x, y;
while (inf >> x >> y) [points addObject:[NSValue valueWithPoint:NSMakePoint(x, y)]];
inf.close();
}
我尝试将构建方案更改为发布和运行,这很好。但每当我直接进入应用程序的查找器并双击它时,它都不起作用,似乎没有任何内容被加载。
答案 0 :(得分:2)
将文件作为资源添加到项目中(这将导致它被复制到正确位置的app包装器中)
使用`[[NSBundle mainBundle] pathForResource:@“map_data”ofType:nil];
这应该为您提供文件的路径。该文件不应该手动复制,它不应该在应用程序包装器旁边,也不应该[猜测]在应用程序包装器中尝试更改或替换文件。
它似乎有时起作用的原因仅仅是巧合。您正在将部分路径传递给NSFileHandle
,并且您的应用的当前工作目录有时会指向正确的位置,以便数据文件可用。
答案 1 :(得分:1)
我不确定NSFileHandle
如何处理相对路径,但通常使用NSBundle
类设置路径。
NSString *path = [[NSBundle mainBundle] pathForResource:@"myfile" ofType:@"ext"];
您也可以简单地从文件内容初始化NSString,您无需先使用NSData
将其读入NSFileHandle
。
NSString *text = [[NSString alloc] initWithContentsOfFile:path
encoding:NSASCIIStringEncoding error:nil];
(如果您需要正确的错误处理,请使用error参数)