Il mio programma carica alcuni dati da un file e li disegna.
La parte di lettura dei file è così:
- (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];
}
Durante il debug, inserisco il file di dati nella directory di [NSBundle mainBundle] e il programma funziona correttamente.
Tuttavia, quando uso raggiungere per estrarre l'app, non funziona mai. Ho inserito il file di dati nello stesso percorso con l'app, ma sembra non riuscire a caricarlo.
Aggiornare
Ho provato a usare c ++, ma ancora fallisce.
- (void)load_file
{
ifstream inf("map_data");
double x, y;
while (inf >> x >> y) [points addObject:[NSValue valueWithPoint:NSMakePoint(x, y)]];
inf.close();
}
Ho provato a cambiare lo schema di build per rilasciarlo ed eseguirlo, il che va bene. Ma ogni volta che vado direttamente nel finder dell'app e faccio doppio clic su di esso, non funziona e sembra che non sia caricato nulla.
risposte:
1 per risposta № 1Non sono sicuro di come vengano gestiti i percorsi relativi NSFileHandle
, ma di solito imposti i percorsi usando il NSBundle
classe.
NSString *path = [[NSBundle mainBundle] pathForResource:@"myfile" ofType:@"ext"];
Puoi anche semplicemente inizializzare un NSString dal contenuto di un file, non è necessario prima leggerlo in un NSData
utilizzando NSFileHandle
.
NSString *text = [[NSString alloc] initWithContentsOfFile:path
encoding:NSASCIIStringEncoding error:nil];
(Utilizzare il parametro error, se si desidera una corretta gestione degli errori)
2 per risposta № 2
aggiungere il file al progetto come risorsa (ciò provocherà la sua copia nel wrapper dell'app nel punto giusto)
usa `[[NSBundle mainBundle] pathForResource: @" map_data "ofType: nil];
Questo dovrebbe darti il percorso del file. Il file non deve essere copiato manualmente, non dovrebbe essere vicino al wrapper dell'app, né si dovrebbe mai [congetture] provare a cambiare o sostituire il file una volta che si trova nel wrapper dell'app.
Il motivo per cui sembra funzionare a volte è una semplice coincidenza. Stai passando un percorso parziale a NSFileHandle
e succede che l'attuale directory di lavoro della tua app a volte punta nel punto giusto in modo che il file di dati sia disponibile.