Leggere una frase da file

di il
13 risposte

Leggere una frase da file

Sto provando a leggere da file un insieme di dati, in particolare ho un file .dat con il seguente contenuto :
1            //int
cazzabubbolo  //string
12                //int
123.56        //float
nota1        //string
2
nullino
12
123.56
nota2
questo è il main
int main() {
	oggetto x[100];
	int id;
	string nome;
	int quanti;
	float costo;
	string nota;
	fstream f;
	f.open("file.dat",ios::in);
	int i=0;
	while(!f.eof()){
		f>>id;
		f>>nome;
		f>>quanti;
		f>>costo;
		f>>nota;
		x[i].setId(id);
		x[i].setName(nome);
		x[i].setQuanti(quanti);
		x[i].setCosto(costo);
		x[i].setNota(nota);
		i++;
	}



	for (int j=0;j<i;j++){
		x[j].print();
		cout<<"|----------|"<<endl;
	}

	f.close();
	return 0;
}
fin qui tt ok, ma se nel file cambio i campi corrispondenti alle string con due parole invece di una il programma termina.
quindi se modifico il file.dat così:
1
cazzabubbolo elettrico //<--------------------------
12
123.56
nota1
2
nullino
12
123.56
nota2
ho l'errore, probabilmente è causato dal fatto che la parola "elettrico" finisce nell'int di sotto, ma come posso ovviare a questa situazione?
ossia come leggo intere frasi da file e le inserisco in una string?

13 Risposte

  • Re: Leggere una frase da file

    http://www.cplusplus.com/reference/string/string/getline/
  • Re: Leggere una frase da file

    oregon ha scritto:


    http://www.cplusplus.com/reference/string/string/getline/
    ho fatto così:
    //============================================================================
    // Name        : Labcode.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    using namespace std;
    #include "head.h"
    #include <fstream>
    
    int main() {
    	oggetto x[100];
    	int id;
    	string nome;
    	int quanti;
    	float costo;
    	string nota;
    	fstream f;
    	f.open("file.dat",ios::in);
    	int i=0;
    	while(!f.eof()){
    		f>>id;
    		getline(f, nome);     //<--------------------
    		f>>quanti;
    		f>>costo;
    		getline(f, nota);   //<---------------------------
    		x[i].setId(id);
    		x[i].setName(nome);
    		x[i].setQuanti(quanti);
    		x[i].setCosto(costo);
    		x[i].setNota(nota);
    		i++;
    	}
    
    
    
    	for (int j=0;j<i;j++){
    		x[j].print();
    		cout<<"|----------|"<<endl;
    	}
    
    	f.close();
    	return 0;
    }
    ma adesso smette di funzionare anche quando la parola è 1
  • Re: Leggere una frase da file

    Manca la

    #include <string>

    e poi dichiara una

    string dummy;

    e scrivi nel ciclo

    f>>id;
    getline(f, dummy);
    getline(f, nome);
    f>>quanti;
    f>>costo;
    getline(f, dummy);
    getline(f, nota);
  • Re: Leggere una frase da file


    ottimo, funziona, ma proprio non capisco qual'è la funzione del getline con dummy
  • Re: Leggere una frase da file

    Il fatto è che la cin precedente lascia nel buffer non letto il newline e la getline successiva lo legge eliminandolo.
  • Re: Leggere una frase da file

    Ok questa è andata !
    ora procedendo nella costruzione del programma mi è venuto in mente (giustamente) di inserire tutto questo passaggio in una funzione che mi restituisca un puntatore al primo oggetto dell'array di oggetti x[100]

    ma sto combinando dei pasticci con i puntatori

    passo i tre file così ci capiamo meglio:
    header
    /*
     * head.h
     *
     *  Created on: 20/giu/2013
     *      Author: olivi_000
     */
    
    #ifndef HEAD_H_
    #define HEAD_H_
    #include <iostream>
    #include <string>
    using namespace std;
    
    class oggetto{
    public:
    	void setName(const string &n){this->nome=n;};
    	void setId(int i){this->id=i;};
    	void setQuanti(int q){this->quanti=q;};
    	void setCosto(float c){this->costo=c;};
    	void setNota(const string &no){this->nota=no;};
    	string getName(){return nome;}
    	int getId(){return id;}
    	int getQuanti(){return quanti;}
    	float getCosto(){return costo;}
    	string getNota(){return nota;}
    	void print();
    private:
      int id;
      string nome;
      int quanti;
      float costo;
      string nota;
    
    };
    
    oggetto loading();//carica il file .dat
    
    #endif /* HEAD_H_ */
    
    file delle funzioni:
    /*
     * fun.cpp
     *
     *  Created on: 20/giu/2013
     *      Author: olivi_000
     */
    
    #include <iostream>
    using namespace std;
    #include "head.h"
    #include <fstream>
    #include <string>
    
    
    
    void oggetto::print(){
    cout<<"ID: "<<id<<endl;
    cout<<"NOME: "<<nome<<endl;
    cout<<"QUANTITA': "<<quanti<<endl;
    cout<<"COSTO: "<<id<<endl;
    cout<<"NOTA: "<<nota<<endl;
    }
    
    
    
    
    
    oggetto loading() {
    	//lettura file .dat
    	oggetto x[100];
    	int id;
    	string nome;
    	string dummy;
    	int quanti;
    	float costo;
    	string nota;
    	fstream f;
    	f.open("file.dat",ios::in);
    	int i=0;
    	while(!f.eof()){
    		f>>id;
    		getline(f, dummy);
    		getline(f, nome);
    		f>>quanti;
    		f>>costo;
    		getline(f, dummy);
    		getline(f, nota);
    		x[i].setId(id);
    		x[i].setName(nome);
    		x[i].setQuanti(quanti);
    		x[i].setCosto(costo);
    		x[i].setNota(nota);
    		i++;
    	}
    
    
    
    	for (int j=0;j<i;j++){
    		x[j].print();
    		cout<<"|----------|"<<endl;
    	}
    
    	f.close();
    	return x[0];
    }
    questo è il main
    //============================================================================
    // Name        : Labcode.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    using namespace std;
    #include "head.h"
    #include <fstream>
    #include <string>
    
    int main() {
    	oggetto lista;
    	lista=loading();
    
    	return 0;
    }
    
    in questo modo la funzione loading mi restituisce soltanto il primo oggetto, e a me non va bene una cosa simile, perchè poi dopo non potrei gestirmi il resto
  • Re: Leggere una frase da file

    Se non ho capito male devi restituire un puntatore ad un vettore di oggetti, quindi la funzione deve essere

    oggetto *Loading()

    e al suo interno devi allocare "dinamicamente" (quindi con una new) i dati del vettore.


    P.S. La classe non la chiamare oggetto ... non ha molto senso ... dai un nome più appropriato e che faccia comprendere di cosa si parla.

    P.P.S. Quando hai un problema diverso, anche nell'ambito dello stesso programma, è meglio aprire un thread distinto altrimenti diventerebbe una discussione lunghissima ...
  • Re: Leggere una frase da file

    Si, infatti ero indeciso se aprirne un altro o meno, ora continuo qui... la prossima volta saprò cosa fare

    ok perfetto, ho risolto, posto il codice se qualcuno vuole vedere come si alloca un array dinamico di oggetti:
    #include <iostream>
    using namespace std;
    #include "head.h"
    #include <fstream>
    #include <string>
    
    int main() {
    	elemento *lista; 
    	lista=loading();//lista punta al primo elemento dell'array di elementi
    	
    
    	return 0;
    }
    
    header
    /*
     * head.h
     *
     *  Created on: 20/giu/2013
     *      Author: olivi_000
     */
    
    #ifndef HEAD_H_
    #define HEAD_H_
    #include <iostream>
    #include <string>
    using namespace std;
    
    class elemento{
    public:
    	void setName(const string &n){this->nome=n;};
    	void setId(int i){this->id=i;};
    	void setQuanti(int q){this->quanti=q;};
    	void setCosto(float c){this->costo=c;};
    	void setNota(const string &no){this->nota=no;};
    	string getName(){return nome;}
    	int getId(){return id;}
    	int getQuanti(){return quanti;}
    	float getCosto(){return costo;}
    	string getNota(){return nota;}
    	void print();
    private:
      int id;
      string nome;
      int quanti;
      float costo;
      string nota;
    
    };
    
    //carica il file .dat in un array di oggetti restituendone il puntatore al primo
    elemento* loading();
    
    #endif /* HEAD_H_ */
    funzioni
    /*
     * fun.cpp
     *
     *  Created on: 20/giu/2013
     *      Author: olivi_000
     */
    
    #include <iostream>
    using namespace std;
    #include "head.h"
    #include <fstream>
    #include <string>
    
    
    
    void elemento::print(){
    cout<<"ID: "<<id<<endl;
    cout<<"NOME: "<<nome<<endl;
    cout<<"QUANTITA': "<<quanti<<endl;
    cout<<"COSTO: "<<id<<endl;
    cout<<"NOTA: "<<nota<<endl;
    }
    
    
    
    
    
    elemento* loading() {
    	
    
    	elemento* x = new elemento [100];
    	int id;
    	string nome;
    	string dummy;
    	int quanti;
    	float costo;
    	string nota;
    	fstream f;
    	f.open("file.dat",ios::in);
    	int i=0;
    	while(!f.eof()){
    		f>>id;
    		getline(f, dummy);
    		getline(f, nome);
    		f>>quanti;
    		f>>costo;
    		getline(f, dummy);
    		getline(f, nota);
    		x[i].setId(id);
    		x[i].setName(nome);
    		x[i].setQuanti(quanti);
    		x[i].setCosto(costo);
    		x[i].setNota(nota);
    		i++;
    	}
    
    
    
    	for (int j=0;j<i;j++){
    		x[j].print();
    		cout<<"|----------|"<<endl;
    	}
    
    	f.close();
    	return x;
    
    
    }
  • Re: Leggere una frase da file

    Cosa è

    elemento

    ?
  • Re: Leggere una frase da file

    "oggetto" l'ho cambiato in" elemento" , come mi era stato detto nel post precedente

    il fatto che il nome sia comunque simile è perchè il programma che sto facendo è un gestionale per un ferramenta
  • Re: Leggere una frase da file

    Ok ... potresti chiamare la classe

    articolo

    dato che è relativo ad un magazzino.

    Ho visto che hai cambiato l'allocazione ... adesso funziona o hai altri errori?

    L'unico problema è che non sai se sono 100 o di più e non sai quanti ne hai letto ...
  • Re: Leggere una frase da file

    Si, adesso funziona, ma hai previsto il problema che sto cercando di risolvere,ho pensato di passare il parametro dim tramite la funzione loading , ma sto creando troppa confusione e mi sto perdendo, non riesco a gestire la lista di articoli a dovere. penso che devo riorganizzare il tutto
  • Re: Leggere una frase da file

    1) la funzione restituisce il puntatore così come è adesso

    2) apri il file e conta le linee

    3) alloca lo spazio per il numero di linee ottenuto

    4) riapri il file e lo leggi

    5) restituisci il puntatore e il numero di linee lette

    Per restituire il numero di linee prevedi un parametro apposito passato per puntatore

    elemento *loading(int *nlinee)
Devi accedere o registrarti per scrivere nel forum
13 risposte