2013-04-02 49 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

相關問題