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++)
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);
}
}
}
}
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.
queste sono le strutture e le costanti definite
codice:
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];
};
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 condizione
codice:
if(argc != 2)
cerr << "Impossibile acquisire da file. Utilizzo: ./a.out <sourcefile>\n";
diventa vera.
il file input è scritto nel seguente modo
codice:
nome
cognome
via
numero civico
comune
cap
provincia
nome2
cognome2
via2
numero civico2
comune2
cap2
provincia2
...
e via così
in modo che ogni riga abbia un solo campo testuale che termina con una newline.
sembra una cosa alquanto semplice e banale, ma con ste maledette limitazioni, diventa alquanto snervante..