C++ Input da file con ifstream

di il
4 risposte

C++ Input da file con ifstream

Ciao, sono un principiante di C++, che è anche il primo linguaggio di programmazione che abbia mai usato. Poiché principalmente ne ho bisogno per analizzare dati di esperimenti stavo provando a scrivere una funzione che accettasse in input un file (nella funzione il nome del file) diviso in blocchi di dati al cui inizio si trova la stringa “/*” e alla fine la stringa "*/". La funzione dovrebbe leggermi i dati di ogni blocco e inserirli in un vettore, per poi inserire ogni vettore in un vettore di vettori. Per intenderci: vorrei accettasse un file scritto così:

/*

3,2

3,11

*/

/*

7,11

*/

La funzione che ho scritto è la seguente:

Poiché compilando ho notato che mi creava dei vettori che contenevano il blocco desiderato ma anche  tutti quelli precedenti, ho provato a creare il ciclo for per eliminare i blocchi precedenti, ma mi dà errore quando uso la funzione erase.

Sono grato a chiunque possa darmi una mano,.

vector<vector<double>> lettura_file (string nome_file){
    vector<vector<double>> vettore_di_dati;
    vector<double> dati;
    double valore;
        ifstream fin(nome_file);
    if(!fin.is_open()){
        cout << "File non aperto correttamente " << endl;
    }
        else{
            cout << "File aperto correttamente " << endl;
            }
    
    string line;
    while (getline(fin, line)) { // Leggo il file riga per riga
                if (line== "/*") { 
                    while (getline(fin, line)) { // Continuo a leggere finché non trovo la fine del commento
                        if (line == "*/") {
                            for(int i = 0; i < vettore_di_dati.size(); i++){
                                vettore_di_dati.push_back(dati);// Aggiungo i dati al vettore principale
                                for(auto c : vettore_di_dati.at(i))
                                    vettore_di_dati.erase(c); //Il compiler mi dà errore
                                continue;
                            }
                        } else {
                            
                                istringstream iss(line);
                                double valore;
                                while (iss >> valore) { // Leggo i valori dalla riga
                                    dati.push_back(valore); // Aggiungo il valore al vettore temporaneo
                            }
                        }
                    }
                }
            }
        
  for(auto c : vettore_di_dati)
      for(auto d : c)
          cout << d << endl;
    return vettore_di_dati;
}

4 Risposte

  • Re: C++ Input da file con ifstream

    Non serve la erase, manca la chiamata di clear del vector dati e di iss.

    Ti scrivo come dovrebbe essere il codice da modificare. Elimina la parte indicata e sostituiscila con questa

                   if (line == "*/") 
                   {
                       vettore_di_dati.push_back(dati);
                       dati.clear();
                       
                       break;
                   }
                   else 
                   {
                       istringstream iss(line);
                       double valore;
                       while (iss >> valore)
                           dati.push_back(valore); 
                       
                       iss.clear();
                   }

    P.S. Ma i dati nel file sono con la virgola (3,11) o con il punto decimale (3.11) ?

  • Re: C++ Input da file con ifstream

    @giacomo, consiglio: lascia perdere il C++. 

    E' un linguaggio di programmazione per ‘esperti’. 

    Moooooooolto complesso per i principianti. 

    Meglio Python, mooooolto meglio

  • Re: C++ Input da file con ifstream

    22/02/2024 - oregon ha scritto:


    Non serve la erase, manca la chiamata di clear del vector dati e di iss.

    Ti scrivo come dovrebbe essere il codice da modificare. Elimina la parte indicata e sostituiscila con questa

                   if (line == "*/") 
                   {
                       vettore_di_dati.push_back(dati);
                       dati.clear();
                       
                       break;
                   }
                   else 
                   {
                       istringstream iss(line);
                       double valore;
                       while (iss >> valore)
                           dati.push_back(valore); 
                       
                       iss.clear();
                   }

    P.S. Ma i dati nel file sono con la virgola (3,11) o con il punto decimale (3.11) ?

    I dati sono col punto decimale. Con il codice che mi hai fornito si salva solo il primo blocco di dati. 

    Ho aggiunto al posto di break, continue  e funziona effettivamente. Grazie mille.

    @Migliorabile lo so che C++ non è per nulla banale. Purtroppo il corso che ho fatto era su questo linguaggio. Tuttavia non escludo di provare a cimentarmi con phyton per semplificarmi la vita.

  • Re: C++ Input da file con ifstream

    Veramente con il break funziona perfettamente a meno che tu non abbia cambiato altro nel codice o nel file dei dati.

    Anzi, la continue è sbagliata anche se il programma funziona lo stesso.

    Mostra sia il codice che il file di testo con cui non funzionerebbe con il break e capiamo il perché.

Devi accedere o registrarti per scrivere nel forum
4 risposte