Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con getline
Forum - C/C++ - Problema con getline

Avatar
Mary78 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/08/2010

Segnala al moderatore
Postato alle 11:12
Martedì, 24/08/2010
Ciao a tutti,
sono nuova del forum e anche una neofita di c++. Ho un problema con questo codice, che deve leggere dei numeri da un file di testo e fare delle semplici operazioni. La compilazione viene eseguita correttamente, ma quando provo ad eseguire mi da errore di segmentazione...credo sia un problema di getline, ma non riesco a capire come risolverlo. Vi sarei molto grata se poteste aiutarmi.
Grazie mille!

#include <stdio.h>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    main ()
    {
      FILE *f_in;
      FILE *f_out;
      int dim_file_in = 0;
      int max_lim = 512;
     const char *nome_file = "lines.txt";
      float R23 = 0.0;
      float media = 0.0;
      ifstream file_in("lines.txt");
      if (file_in == NULL)
      {printf("\n Errore\n", "lines.txt");
        exit(-1);}
       while (!file_in.eof())
       {
         file_in.getline (NULL, max_lim);
         dim_file_in++;
        }
       file_in.seekg(0, ios::beg);
            while (!feof(f_in)) {
        float OII, OIIIa, OIIIb, Hb;
        float rOII, rOIIIa, rOIIIb;
        fscanf (f_in, "%e %e %e %e", &OII, &OIIIa, &OIIIb, &Hb);
        rOII = OII / Hb;
        rOIIIa = OIIIa / Hb;
        rOIIIb = OIIIb / Hb;
        R23+= (rOII + rOIIIa + rOIIIb);
    printf ("%e %e %e %f\n", rOII, rOIIIa, rOIIIb, R23);
     dim_file_in++;}
      file_in.close();
      media = R23 / dim_file_in;
      ofstream file_out("media.txt");
      file_out << "Valore medio del parametro R23: " << media << endl;
      file_out.close();
    }

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 416
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 12:54
Martedì, 24/08/2010
hai fatto un po una confusione :S hai mischiato i FILE della libreria stdio con quelli della libreria fstream, probabilmente perchè volevi usare fscanf per leggere i dati. Ebbene, puoi farlo anche con un file:
Codice sorgente - presumibilmente C/C++

  1. float dato;
  2. stream >> dato;


comunque ora guardo meglio il codice

PM Quote
Avatar
Mary78 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/08/2010

Segnala al moderatore
Postato alle 13:09
Martedì, 24/08/2010
Grazie per l'attenzione lumo...
Come dicevo, sono nuova della programmazione e per di piu' autodidatta, quindi posso immaginare che il codice sia confuso. Ho provato anche a dare un array di caratteri come primo argomento di getline, ma non esegue lo stesso :(

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 416
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 13:38
Martedì, 24/08/2010
ecco ho messo a posto il codice, ora dovrebbe funzionare
Codice sorgente - presumibilmente C++

  1. #include <fstream>
  2. #include <iostream>
  3. #include <iomanip>
  4. using namespace std;
  5.    
  6. int main()
  7. {
  8.    ifstream file_in("lines.txt");
  9.    if ( !file_in.is_open() ) // se il file non è aperto
  10.    {
  11.       cerr << "\n Errore\n" << "lines.txt" << endl;
  12.       return -1; // al posto di exit() metto un return
  13.    }
  14.    float OII, OIIIa, OIIIb, Hb, R23;
  15.    float rOII, rOIIIa, rOIIIb;
  16.    int dim_file_in = 0;
  17.    const int max_lim = 512;
  18.    
  19.    file_in.setf( ios::skipws ); // salto gli spazi e i newline
  20.    while ( !file_in.eof() && dim_file_in < max_lim ) // se non siamo arrivati alla fine del file e non abbiamo superato il limite massimo di righe
  21.    {
  22.       file_in >> OII >> OIIIa >> OIIIb >> Hb; // leggo i dati
  23.                  
  24.       rOII = OII / Hb;
  25.       rOIIIa = OIIIa / Hb;
  26.       rOIIIb = OIIIb / Hb;
  27.       R23+= (rOII + rOIIIa + rOIIIb);
  28.      
  29.       dim_file_in++; // aumento il contatore delle righe
  30.    }
  31.    
  32.    file_in.close();
  33.    
  34.    
  35.    float media;
  36.    media = R23 / dim_file_in;
  37.    ofstream file_out("media.txt");
  38.    
  39.    file_out << "Valore medio del parametro R23: " << media << endl;
  40.    file_out.close();
  41.    return 0;
  42. }


ho tolto le printf e le scanf ( tipiche del C ) e ho usato le iostream del C++, e ho commentato il while
se vuoi una reference della libreria standard del C++, http://www.cplusplus.com/reference/

Ultima modifica effettuata da lumo il 24/08/2010 alle 13:38
PM Quote
Avatar
Mary78 (Normal User)
Newbie


Messaggi: 3
Iscritto: 24/08/2010

Segnala al moderatore
Postato alle 13:46
Martedì, 24/08/2010
Sei un genio...funzionaaaaa!
Non so davvero come ringraziarti, stavo impazzendo!
Grazie, grazie, grazie

PM Quote