praticamente mi sto preparando per un esame stupido, che però è assai fastidioso visto che un sacco di cose del linguaggio NON posso assolutamente usarle(break, un sacco di librerie c++ standard, classi, niente ide -.-)..
in questo caso è una stupidissima e noiosissima agenda/rubrica, su file sorgente unico (-_-). in pratica mi trovo a modificare un codice piuttosto semplice, anche se è una rottura trattarlo con emacs (gusti sono gusti ok, ma valli a capire i docenti .-. )..
in pratica devo aggiungere una serie di funzioni o procedure (almeno qua in questo caso posso scegliere!) che acquisisca da un qualsivoglia file gli elementi che altrimenti verrebbero inseriti tramite input da terminale con cin..
il codice è piuttosto lungo, pertanto posto solo le aree interessate
questa è la procedura che sto tentando di creare con i pochi elementi che posso usare (iostream, fstream e c-strings, niente strings c++)
so che non ci sono controlli in caso il file sia sbagliato, non li ho messi perché non sono richiesti ed il file di input viene scritto ad hoc.codice:void file_acquire(int argc, char* argv[], persona& p, gruppo& g) { fstream myin; if(argc != 2) cerr << "Impossibile acquisire da file. Utilizzo: ./a.out <sourcefile>\n"; else { myin.open(argv[1], ios::in); if(myin.fail()) cerr << "Errore, il file " << argv[1] << " non trovato.\n"; else { while(!myin.eof()) { myin >> p.nome; myin >> p.cognome; myin >> p.indirizzo.via; myin >> p.indirizzo.civico; myin >> p.indirizzo.comune; myin >> p.indirizzo.cap; myin >> p.indirizzo.prov; inserisci_persona_gruppo(p, g); } } } }
queste sono le strutture e le costanti definite
per compilare compila, ma una volta che eseguo in terminale (./a.out input), se faccio partire la procedura che acquisice da file va in loop infinito e poi da segmentation fault dopo un po' di tempo. Non capisco il perché, anche perché non so come dare il comando (./a.out input) al debugger (potrò usare solo DDD), e quindi se eseguo il codice in ddd la condizionecodice:const int N_MAX_PERSONE = 10; const int N_MAX_NOME = 20; const int N_MAX_COGNOME = 30; struct address { char via[N_MAX_NOME]; int civico; char comune[N_MAX_NOME]; int cap; char prov[3]; }; struct persona { char nome[N_MAX_NOME]; char cognome[N_MAX_COGNOME]; address indirizzo; }; struct gruppo { int npers; persona* nomi[N_MAX_PERSONE]; persona* cognomi[N_MAX_PERSONE]; };
diventa vera.codice:if(argc != 2) cerr << "Impossibile acquisire da file. Utilizzo: ./a.out <sourcefile>\n";
il file input è scritto nel seguente modo
in modo che ogni riga abbia un solo campo testuale che termina con una newline.codice:nome cognome via numero civico comune cap provincia nome2 cognome2 via2 numero civico2 comune2 cap2 provincia2 ... e via così
sembra una cosa alquanto semplice e banale, ma con ste maledette limitazioni, diventa alquanto snervante..

Rispondi quotando