Mój program ładuje niektóre dane z pliku, a następnie je rysuje.
Część do odczytu plików wygląda następująco:
- (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];
}
Podczas debugowania umieszczam plik danych w katalogu [NSBundle mainBundle], a program działa dobrze.
Jednak gdy używam polecenia osiągnij, aby wyjąć aplikację, nigdy się nie uruchamia. Umieszczam plik danych w tej samej ścieżce co aplikacja, ale wydaje się, że nie można go załadować.
Aktualizacja
Próbowałem użyć c ++, ale nadal nie działa.
- (void)load_file
{
ifstream inf("map_data");
double x, y;
while (inf >> x >> y) [points addObject:[NSValue valueWithPoint:NSMakePoint(x, y)]];
inf.close();
}
Próbowałem zmienić schemat kompilacji w celu wydania i uruchomienia, co jest w porządku. Ale ilekroć wchodzę bezpośrednio do wyszukiwarki aplikacji i klikam ją dwukrotnie, nie działa i wydaje się, że nic nie jest ładowane.
Odpowiedzi:
1 dla odpowiedzi № 1Nie jestem pewien, jak obsługiwane są ścieżki względne NSFileHandle
, ale zwykle konfigurujesz ścieżki za pomocą NSBundle
klasa.
NSString *path = [[NSBundle mainBundle] pathForResource:@"myfile" ofType:@"ext"];
Możesz także po prostu zainicjować NSString z zawartości pliku, nie musisz najpierw czytać go w pliku NSData
za pomocą NSFileHandle
.
NSString *text = [[NSString alloc] initWithContentsOfFile:path
encoding:NSASCIIStringEncoding error:nil];
(Użyj parametru błędu, jeśli chcesz poprawnie obsługiwać błąd)
2 dla odpowiedzi nr 2
dodaj plik do projektu jako zasób (spowoduje to skopiowanie go do opakowania aplikacji w odpowiednim miejscu)
użyj `[[NSBundle mainBundle] pathForResource: @" data_data "ofType: nil];
To powinno dać ci ścieżkę do pliku. Plik nie powinien być kopiowany ręcznie, nie powinien znajdować się obok opakowania aplikacji, ani nie należy [przypuszczać], że kiedykolwiek spróbujesz zmienić lub zastąpić plik, gdy znajdzie się on w opakowaniu aplikacji.
Powodem, dla którego wydaje się czasem działać, jest zwykły zbieg okoliczności. Przechodzisz częściową ścieżkę do NSFileHandle
i zdarza się, że bieżący katalog roboczy Twojej aplikacji czasami wskazuje właściwe miejsce, tak aby plik danych był dostępny.