0

我的程序从文件中加载一些数据,然后绘制它们。

文件读取部分是这样的:

- (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]目录下,程序运行正常。

但是,当我使用实现来取出应用程序时,它永远不会运行。我将数据文件放在与应用程序相同的路径中,但似乎无法加载它。


更新

我尝试使用 c++,但仍然失败。

- (void)load_file
{
    ifstream inf("map_data");
    double x, y;
    while (inf >> x >> y) [points addObject:[NSValue valueWithPoint:NSMakePoint(x, y)]];
    inf.close();
}

我尝试将构建方案更改为发布并运行,这很好。但是每当我直接进入应用程序的查找器并双击它时,它就不起作用并且似乎没有加载任何内容。

4

2 回答 2

2
  • 将文件作为资源添加到项目中(这将导致它被复制到正确位置的应用程序包装器中)

  • 使用`[[NSBundle mainBundle] pathForResource:@"map_data" ofType:nil];

那应该给你文件的路径。该文件不应该被手动复制,它不应该在应用程序包装器旁边,你也不应该在应用程序包装器中尝试更改或替换文件。

它有时似乎起作用的原因仅仅是巧合。您正在传递部分路径,NSFileHandle并且您的应用程序的当前工作目录有时会指向正确的位置,以便数据文件可用。

于 2013-04-02T15:52:41.987 回答
1

我不确定如何处理相对路径,但通常您使用该类NSFileHandle设置路径。NSBundle

NSString *path = [[NSBundle mainBundle] pathForResource:@"myfile" ofType:@"ext"];

您也可以简单地从文件的内容初始化一个 NSString,您不需要先将它读入NSDatausing NSFileHandle

NSString *text = [[NSString alloc] initWithContentsOfFile:path 
                                   encoding:NSASCIIStringEncoding error:nil];

(如果您想要正确的错误处理,请使用错误参数)

于 2013-04-02T15:12:54.410 回答