Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C++] fstream: acquisizione da file testuale e segmentation foult

    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..

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mostra anche il resto del codice.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ovvero, il main e la funzione inserisci_persona_gruppo
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    eccole qua.. la formattazione è leggermente diversa (è il file originale) ma sono identici nel resto

    codice:
    int main ()
    {
      persona * pos;
      char cognome[NmaxCognome];
      char nome[NmaxNome];
      persona p;
      gruppo g;
      char s[2];
    
      inizializza_gruppo(g);   
      do {    
        cout << endl;
        cout << " i: inserisci\n";
        cout << " f: inserisci da file\n";
        cout << " n: stampa per ordine di nome\n";
        cout << " c: stampa per ordine di cognome\n";
        cout << " o: cerca per nome\n";
        cout << " g: cerca per cognome\n";
        cout << " e: esci\n";
        cout << "\nInserisci Scelta: ";
        cin >> s;
    
        switch (s[0]) {
        case 'i': leggi_persona(p); 
          inserisci_persona_gruppo(p,g);
          break;
        case 'f': file_acquire(argc, argv, p, g); break;
        case 'n': stampa_gruppo_per_nome (g); break;
        case 'c': stampa_gruppo_per_cognome (g); break;
        case 'o': leggi_nome(nome);
          pos=cerca_per_nome(nome,g); 
          if (pos==NULL)
    	cout << "Non trovato\n";
          else {
    	cout << "Trovato: "  << endl;
    	stampa_persona(*pos);
          }
          break;
        case 'g': leggi_cognome(cognome);
          pos=cerca_per_cognome(cognome,g); 
          if (pos==NULL)
    	cout << "Non trovato\n";
          else {
    	cout << "Trovato: "  << endl;
    	stampa_persona(*pos);
          }
          break;
        case 'e': break;
        default: cout << "scelta non capita\n";
        }
      }
      while ((s[0]=='i' || s[0]=='n' || s[0]=='c' || s[0]=='o' || s[0]=='g'));
    }

    codice:
    void inserisci_persona_gruppo (persona & p, gruppo & g) 
    {
      persona * tmp;
      tmp = new(persona);
      *tmp = p;
      g.nomi[g.npers] = tmp;
      g.cognomi[g.npers] = tmp;
      g.npers++;
      ordina_per_nome(g.nomi,g.npers);
      ordina_per_cognome(g.cognomi,g.npers);
    }

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    E se l'errore è nelle

    ordina_per_nome
    ordina_per_cognome

    come lo possiamo vedere?

    P.S. A proposito ... che senso ha chiamare due funzioni che ordinano per campi diversi ?

    EDIT: sei fortunato ... ... il problema è in

    g.nomi[g.npers]

    in cui g.npers non ha un valore valido in quanto non è inizializzato in precedenza.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    le due funzioni sono dei semplici sort(bubble, anche se volevo sostituirle una volta finito tutto con quicksort) giusto per metterli, che vanno ad agire su
    codice:
      persona* nomi[N_MAX_PERSONE];
      persona* cognomi[N_MAX_PERSONE];
    che altro non sono che degli arrai di puntatori, due tipi eprché poi c'è la possibilità di stampare l'intera lista della rubrica sia per ordine crescente di nomi sia per ordine crescente di cognomi.
    i due sort funzioni funzionano benissimo con l'input da terminale, e non le ho toccate.

  7. #7
    mmmm compilato ora con visual studio.. da determinale se lancio la funzione per acquisire da file semplciemente termina il programma

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Hai letto quello che ti ho scritto su

    g.nomi[g.npers]

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    sì, npers viene inizializzato in inizializza_gruppo(g);
    codice:
    void inizializza_gruppo(gruppo& g) {
      g.npers = 0;
    }

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da DarkRadeon
    sì, npers viene inizializzato in inizializza_gruppo(g);
    codice:
    void inizializza_gruppo(gruppo& g) {
      g.npers = 0;
    }
    Beh ... se non posti TUTTO il codice, possiamo stare anni ...

    A questo punto, è possibile che i nomi del file siano più di 10 ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.