Apertura file con separatori

di il
8 risposte

Apertura file con separatori




ifstream myfile("corsa.txt");

	int anno;
	string a;
	string nome;
	float tempo;
	string t;
	string luogo;

	if (myfile.is_open()) {



		while (getline(myfile, a , ':')) {
			istringstream token(a);
			token >> anno;

			getline(myfile, t , ':');
			istringstream token2( t );
			token2 >> tempo ;


			getline(myfile, nome, ':');

			
			getline(myfile, luogo );
			

			Item it(anno, tempo , nome, luogo);
			
			L1.insert(it);
		}
	}

	else {

		cout << "errore di apertura del file " << endl;
		return -1;
	}
	myfile.close();
  


ho un file , atleti.txt che è fatto cosi:

1972:10.07:Valeriy Borzov:Munich

si presenta nel formato anno (int ) , tempo (float) , nome (string) , luogo (string). non riesco a capire dove sbaglio al momento di aprire il file e estrapolare i dati da esso.. mi compare l'errore " 'Item::Item(int,std::string,float,std::string)': impossibile convertire l'argomento 2 da 'float' a 'std::string' " ma apro i file nello stesso modo delle ultime prove e non ho mai avuto problemi... l'unica differenza stavolta è che il tempo è in formato float. io ho estratto il dato dal primo : al secondo : e poi l'ho inserito in t (string) per poi convertirlo in tempo (float). quindi nel file .h , per definire l'item ho scritto :


class Item {
private:

    
       
    int anno;
    string nome;
    float tempo;
    string luogo;

public:
    Item(int a = 0 ,  string n = "", float t = 0.0, string l = "") { anno = a; nome = n;  tempo = t; luogo = l; }
    
    int null() { 

        return anno == maxKey; // più avanti è richiesto un albero con questo campo come chiave 
    }
    
    int key() const { return anno; }
    
    string getnome() const { return nome; } 
    int getanno() const { return anno; }
    float gettempo() const { return tempo; }
    string getluogo() const { return luogo; }

    void setnome(string n) { nome = n; } 
    void settempo(float t) { tempo = t; }
    void setvelocità(string l) { luogo = l; }



forse per i float mi sono persa qualcosa dalla teoria e devo estrarre i numeri prima della virgola e quelli dopo separatamente ?

8 Risposte

  • Re: Apertura file con separatori

    File
    
    Pippo:9.99:Madrid
    Marcello:9.80:Tokyo
    
    Programma
    
    #include <iostream>  
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main(){
    ifstream myfile;
    myfile.open("corsa.txt", ifstream::in);
    string a; 
    float f;
    if (myfile.is_open()){    
        while (getline(myfile, a, ':')) {
            cout << a;
            try{
                f = stof(a);
                cout << " <<<--- questo e' un float = " << f;
            }
            catch(...){}       
            cout << endl;
        }
    }
    return 0;
    }
    
  • Re: Apertura file con separatori

    Posso chiederti perchè se al'interno del ciclo metto Item it( anno , nome , tempo , luogo); funziona tutto perfettamente mentre se metto Item it( anno , tempo , nome , luogo); mi riporta l'errore sopra citato su anno ? giusto per capire qual'è il problema e continuare ad utilizzare le porzioni di codice fatte a lezione. ovviamente dopo entrambe faccio una insert nella lista.grazie mille
  • Re: Apertura file con separatori

    Il costruttore che hai usato nella classe è

    Item(int a = 0 , string n = "", float t = 0.0, string l = "") { anno = a; nome = n; tempo = t; luogo = l; }

    dovresti capirlo da solo ...
  • Re: Apertura file con separatori

    A rappresenta l’anno è un int ed è inizializzato a 0 , il nome è una stringa così come il luogo quindi li inizializzo a “ “ , il tempo t è un float quindi lo inizializzo a 0.0. Dovevo forse usare il costruttore di default ? La conversione con l’utilizzo della getline non è necessaria per le string mentre devo convertire anno e appunto float probabilmente sono un pollo , ma non ci arrivo.. non capisco proprio dove sbaglio
  • Re: Apertura file con separatori

    Non puoi mettere gli argomenti in un ordine arbitrario: se il tempo è il terzo nel tuo costruttore, perché vuoi passarglielo come secondo? Cambia la dichiarazione del costruttore allora

    Poi comunque è sempre meglio passare le stringhe per gestire le eccezioni.
  • Re: Apertura file con separatori

    Grazie mille, mi era sinceramente sfuggito. Devo tornare a ripassare la teoria sui costruttori
  • Re: Apertura file con separatori

    Ti è sfuggito?

    Non vale solo per i costruttori ma per ogni funzione utilizzata nel linguaggio. Se non prevedi quell'ordine di argomenti non puoi usarli a caso
  • Re: Apertura file con separatori

    Sono completamente autodidatta , sicuramente i miei errori risultano osceni e sono perfettamente conscia di dover studiare ancora moltissimo. Faccio comunque del mio meglio , anche se non sembra
Devi accedere o registrarti per scrivere nel forum
8 risposte