2013-04-02 108 views
0

我的程序从文件加载一些数据,然后绘制它们。为什么我的程序可以在Xcode中运行,但无法作为单独的应用程序运行?

的文件读取的部分是这样的:

- (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(); 
} 

我试图改变构建方案释放和运行,这很好。但每当我直接进入应用程序的发现者,并双击它,它不起作用,似乎没有加载。

+0

您必须进行存档构建并将其共享给Finder。您无法直接从Finder运行调试版本。 – matt

+0

@matt,我知道,我是这么做的。 – HanXu

回答

1

我不知道NSFileHandle如何处理相对路径,但通常使用NSBundle类设置路径。

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

你也可以简单地初始化从文件的内容一个NSString,你不需要使用NSFileHandle先读入NSData

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

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

+0

它不起作用,我认为路径不正确。在你的代码中,路径是“〜/ Library/Developer/Xcode/DerivedData/graph_drawer -dnqhjikipiupyeecmplqquxxkvsp/Build/Products/Debug/graph_drawer.app/Contents/Resources/map_data”,但是我的map_data文件位于与应用程序,即“〜/ Library/Developer/Xcode/DerivedData/graph_drawer -dnqhjikipiupyeecmplqquxxkvsp/Build/Products/Debug/map_data” – HanXu

+2

为什么要在应用程序旁边放置文件?这不是你通常这样做的方式。您可以将文件放入应用程序包(在应用程序包中),如您发布的第一个路径所指定的,或者将其放入〜/ Library/Application Support/YourApp – DrummerB

+0

好的,谢谢,我会这么做的。 – HanXu

2
  • 文件添加到项目的资源(这将导致它被复制到该应用程序包装右点)

  • use`[[NSBundle mainBundle] pathForResource:@“map_data”ofType:nil];

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

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

+0

明白了,非常感谢! – HanXu

相关问题