Aus Txt-datei (in Objekt) einlesen?



  • Hallo ich hoffe jemand kann mir helfen.
    Ich habe eine Textdatei die ich auslesen muss und zwar in ein Objekt....

    als Beispiel habe ich hier den Inhalt bzw Auszug der text datei:
    Energie Cottbus,10,4,3,3,14,13,15
    Hannover 96,10,1,4,5,9,20,7
    1. FC Nuernberg,11,2,7,2,13,11,13
    Hertha BSC,10,4,4,2,16,12,16

    dann habe ich eine Klasse:

    #pragma once
    #include <fstream>
    #include <iostream>
    #include <sstream>
    using namespace std; 
    
    class Mannschaft
    {
    private:
    	char mannschaftsName[24];
    	int punkte, spieleGespielt, spieleGewonnen, spieleUnentschieden, spieleVerloren, toreErzielt, toreKassiert;
    public:
                //friend ostream& operator<<(ostream& out, const Mannschaft &m);
    //friend istream& operator>>(istream& is, Mannschaft &team); //richtig??
    	friend class Tabelle;
    
    };
    

    ich habe noch eine klasse weil ich die einzelnen zeilen in einen Vector abspeichern muss

    #pragma once
    //#include "Array.h"
    #include <vector>
    #include "Mannschaft.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    class Tabelle
    {
    public:
    	Tabelle();
    	virtual ~Tabelle();
    	//friend class Mannschaft; //test
    	char test;
    	void ZeigeTabelle();
    	void sortTab();
    	void NeueMannschaft(Mannschaft&);
    	void toStream( ostream& os );
    	void fromStream(); //test
    	int setPunkte(Mannschaft &M);
    	bool operator() (const Mannschaft&, const Mannschaft&);
    	//Array<Mannschaft>Mannschaftstabelle;
    	vector<Mannschaft>Mannschaftstabelle;	
    };
    

    ..die einzelnen funktionen sind erstmal nebensächlich daher habe ich nur mal aufgeführt. ich möchte nur mal wissen wie ich in der "Main" die Txtdatei in das
    Objekt , Vektor einlesen kann.
    danke im voraus

    gruss sten



  • Ich weiß nicht, ob das die eleganteste und schnellste Lösung ist, aber etwa in folgender Art sollten sich die einzelnen Zeilen aus der Datei einlesen und "zerlegen" lassen:

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    ////////////////////////////////////////////////////////
        string zeile;
    	string elemente[8];
        int counter = 0;
    
    	ifstream input;
    
    	// File öffnen
    	input.open("Input.txt", ios_base::in);
    	if(!input)
    	{
    		cout << "\nDatei konnte nicht geöffnet werden!\n";
    		exit(-1);
    	}
    
    	// File einlesen bis Dateiende
    	while(!input.eof())
    	{	
    		// Zeile einlesen
    		getline(input, zeile);
    		// Zeile zerlegen
    		istringstream line(zeile);
    		for(int i = 0; i < 8; i++)
    		{
    			// "Bereiche" zwischen den Kommata einlesen und in string-array "elemente" speichern
    			getline(line, elemente[i], ',');
    		}
    
        //hier musst du dann die in "elemente"-strings abgelegten Werte deinen 
        //Membervariablen der Klasse "Mannschaft" zuweisen (bzw. den Mannschaft-Objekten 
        //deines Vektors Mannschaftstabelle), etwa in folgender Manier:
    		Mannschaftstabelle[counter].mannschaftsName = elemente[0];
    		Mannschaftstabelle[counter].punkte = atoi(elemente[1].c_str());
    		//usw.
            counter++;
        }
        input.close();
    

    Musst halt schauen, dass du das ganze am besten in eine Methode von Tabelle verpackst.

    MfG, Nanuq



  • sten schrieb:

    Hallo ich hoffe jemand kann mir helfen.
    Ich habe eine Textdatei die ich auslesen muss und zwar in ein Objekt....

    als Beispiel habe ich hier den Inhalt bzw Auszug der text datei:
    Energie Cottbus,10,4,3,3,14,13,15
    Hannover 96,10,1,4,5,9,20,7
    1. FC Nuernberg,11,2,7,2,13,11,13
    Hertha BSC,10,4,4,2,16,12,16

    Hallo Sten,

    ich schlage Dir folgendes Verfahren vor:

    #pragma once
    #include <iosfwd>
    #include <string>
    // using namespace std;  NIE im Header!
    
    class Mannschaft
    {
    private:
        std::string mannschaftsName;    // besser std::string
        int punkte, spieleGespielt, spieleGewonnen, spieleUnentschieden, spieleVerloren, toreErzielt, toreKassiert;
    public:
        //friend ostream& operator<<(ostream& out, const Mannschaft &m);
        friend std::istream& operator>>( std::istream& is, Mannschaft &team); //richtig?? genau so! .. nur std:: fehlte
        friend class Tabelle;
    };
    
    // File: Mannschaft.cpp
    #include "Mannschaft.h"
    #include <iostream>
    
    std::istream& komma( std::istream& in )
    {
        char k;
        if( in >> k && k != ',' )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    std::istream& operator>>( std::istream& is, Mannschaft &team )
    {
        Mannschaft t;
        if( getline( is, t.mannschaftsName, ',' )
            && is >> t.punkte >> komma >> t.spieleGespielt >> komma >> t.spieleGewonnen >> komma >> t.spieleUnentschieden
                >> komma >> t.spieleVerloren >> komma >> t.toreErzielt >> komma >> t.toreKassiert 
            && is.ignore( 9999, std::istream::traits_type::to_int_type( '\n' ) ) )
            team = t;
        return is;
    }
    
    // File: main.cpp
    #include "Mannschaft.h"
    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    int main()
    {
        using namespace std;
        vector< Mannschaft > teams;
        ifstream datei( "input.txt" );
        copy( istream_iterator< Mannschaft >( datei ), istream_iterator< Mannschaft >(), back_inserter( teams ) );
        // usw.
        return 0;
    }
    

    Gruß
    Werner


Anmelden zum Antworten