Non ho fatto in tempo a leggere ieri notte, grazie per la dritta.
Posso "passare" per char pointer dunque senza incorrere nella tua ira?
Ok, fatto. Ora nasce una nuova questione: dovendo ripetere la stessa procedura per diversi file diversi, ho definito naturalmente una funzione da chiamare n volte (5 per ora) con i file di cui sopra come argomento.
Due cose:
1) Come posso far sì che una funzione invii al file stream in uscita una stringa?
Inizialisso lo stream nel main (es. ofstream output(nome_file);)
), poi lo passo come parametro alla funzione, e all'interno della stessa do il solito output>>stringa;? Così facendo non funge. E' la via giusta e sbaglio qualche dettaglio oppure devo aprire lo stream all'interno della funzione? Non è sconveniente aprire e chiudere un file n volte (tante quante sono le chiamate della funzione)?
2) Argomento su cui sono davvero totalmente digiuno, ovvero le eccezioni. Al momento io devo leggere i file relativi a cinque parti del cervello di x pazienti diversi (quelli identificati con l'id di quattro lettere di cui sopra). Tanto per non compilare e ricompilare di continuo mi sono inventato il barbarico metodo di cui sopra: ho creato per ciascun paziente una directory all'interno di quella principale, e in ciascuna directory ci sono i file relativi al paziente stesso, identificati non più con la caotica stringa con cui mi sono stati inviati ma con il nome della parte del cervello ivi contenuta sotto forma di vtkPolyData. In ogni cartella in pratica dovrei avere un file caudato.vtk, un pallido.vtk, un putamen.vtk, un calloso.vtk e un nbase.vtk.
Il problema è che al momento non ho ancora tutti i dati di ciascun paziente: tre pazienti sono "completi", mentre gli altri hanno chi i dati di una sola parte, chi quelli di due, chi di tre... prima di creare la funzione di cui sopra (che mi da in output una valore di tipo "struttura_da_me_definita" che comprende un campo numerico e un campo attore da inviare al rendering) partiva un messaggio di errore, ma il programma lavorava solo sui dati in suo possesso ignorando i mancanti. Poi io provvedevo in uscita a dire "Se il valore è nullo si vede che mancava il dato e scrivi che il dato manca, altrimenti scrivi il valore".
Ora con i pazienti "completi" va tutto bene, con gli altri il programma viene terminato nella vergogna. Ho realizzato che l'errore si presenta non nel momento di caricare il file, ma all'interno della funzione, errore del tipo "Qualche puntatore fa il gaglioffo..." (quello sulla memoria che non poteva essere "read").
Mi chiedevo a questo punto come gestire la cosa in modo da evitare questo problema molto fastidioso (che al momento mi costringe a compilare la primitiva versione da 700 righe anziché quella da 500, e soprattutto mi irrita alquanto), e credo che la risposta sia nelle eccezioni.
Come dicevo però, si tratta di un argomento a me nuovo.
Si trattasse di gestire un'eccezione tipo l'utente pistola che mi da cinque caratteri invece che quattro, come dicevamo, saprei cavarmela semplicemente con quel poco che ho appreso su try, throw, catch, mentre così... boh!!! Devo cercare nella documentazione delle classi che uso il codice d'errore, e dire che se catch riceve un'eccezione di quel genere deve restituire un errore e skippare l'istanza (termine improprio ma ci siamo capiti ) della funzione?
Forse dovrei agire prima ancora, nel main, dicendo "Se il reader non trova il file allora lancia questa eccezione e salta "l'istanza"(nuovamente termine improprio)"? O forse niente eccezioni ma un semplice
if(il_file_può_essere_aperto_dall'ifstream){fai il tuo dovere}
else {skippa la parte del cervello che manca};
?
EDIT: Ho adottato il metodo di cui sopra, con if/else.
Per verificare l'esistenza uso una funzione trovata online leggermente modificata da me:
bool doesExist(string filepath)
{
bool exists = false;
fstream fin;
fin.open(filepath.data() ,ios::in);
if( fin.is_open() )
exists=true;
fin.close();
return exists;
};
Sono soddisfatto così, ora devo capire come gestire la faccenda dell'output da interno funzione, ma non è proprio così necessario.
Qualcuno qui ha esperienza nell'uso di FLTK?