Textdatei einlesen



  • Guten Abend

    Meine Textdatei sieht wiefolgt aus

    nr.	X	Y
    1	91	5
    2	56	77
    3	79	89
    4	12	46
    5	97	22
    6	90	9
    7	80	30
    8	62	26
    9	5	45
    10	32	36
    

    Ich möchte die x und y Koordinaten auslesen und speichern
    Ich bekomme allerdings nur 0en.

    #include<iostream>
    #include<vector>
    #include<fstream>
    using namespace std;
    
    struct kunde														//Struktur Kunde
    {
    	double x;
    	double y;
    };
    
    vector<kunde> daten;												//Vektor für Kundendaten
    
    void main()
    {
    	ifstream infile("Text.txt");									//Textdatei einlesen und Koordinaten in Vektor daten speichern
    	for (int i=1; i<=10; i++)											
    	{
    		kunde knd;
    		for (int j=0; j<3; j++)
    		{
    			double data(0);
    			infile >> data;
    			if (j==1)
    			{
    				knd.x = data;
    			}			
    			if (j==2)
    			{
    				knd.y = data;
    
    			}
    		}
    		daten.push_back(knd);	
    
    	}	
    	infile.close();													//Textdatei wieder schließen
    
    	system("pause");
    }
    


  • Du musst irgendwie die erste Zeile überspringen, da steht nur Müll drin (jedenfalls kein double). Möglichkeiten wären cin.ignore und cin.getline.



  • #include <iostream>
    #include <stdexcept>
    #include <string>
    #include <sstream>
    #include <limits>
    #include <map>
    struct Customer
    {
        double X;
    	double Y;
    	explicit Customer(double X = 0., double Y = 0.)
    		: X(X), Y(Y)
    	{
    	}
    };
    template<typename CharT>
    std::basic_istream<CharT>& operator>> (std::basic_istream<CharT>& Stream, Customer& Object)
    {
    	if(!(Stream >> Object.X) || !(Stream >> Object.Y))
    	{
    		throw std::invalid_argument(std::string("Couldn't parse input"));
    	}
    	return Stream;
    }
    template<typename CharT, typename Traits>
    std::basic_ostream<CharT, Traits>& operator<< (std::basic_ostream<CharT, Traits>& Stream, Customer const& Object)
    {
    	::std::basic_ostringstream<CharT, Traits> StrStream;
    	StrStream.flags(Stream.flags());
    	StrStream.imbue(Stream.getloc());
    	StrStream.precision(Stream.precision());
    
    	StrStream << Object.X << '\t' << Object.Y;
    
    	return Stream << StrStream.str();
    }
    int main()
    {
        std::istream& Source = std::cin;
    	Source.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    	typedef std::map<unsigned, Customer> ListType;
    	ListType List;
    	{
    		unsigned Nr;
    		Customer InputCustomer;
    		try
    		{
    			while((Source >> Nr) && (Source >> InputCustomer))
    			{
    				List[Nr] = InputCustomer;
    			}
    		}
    		catch(std::invalid_argument const& Exception)
    		{
    			std::cerr << Exception.what();
    			return -1;
    		}
    	}
    	std::cout << "Nr.\tX\tY\n";
    	for(ListType::const_iterator i = List.begin(); i != List.end(); ++i)
    	{
    		std::cout << i->first << '\t' << i->second << '\n';
    	}
    }
    

    http://ideone.com/YPU2iS

    edit: wenn du - wie bei deinem code - aus der datei lesen willst, dann initialisiere die referenz "Source" einfach mit deinem ifstream.



  • Puh so gut bin ich leider in C++ noch nicht das ich da viel von verstehe 😞

    Kann man nicht irgendwie mit 1-2 Zeilen schreiben das er einfach ab Zeile 2 beginnen soll ?



  • ide schrieb:

    Puh so gut bin ich leider in C++ noch nicht das ich da viel von verstehe 😞

    Kann man nicht irgendwie mit 1-2 Zeilen schreiben das er einfach ab Zeile 2 beginnen soll ?

    doch, siehe bei mir zeile 40.


  • Mod

    throw std::invalid_argument(std::string("Couldn't parse input"))
    

    ... wieso die Konvertierung zu string ?

    ::std::basic_ostringstream<CharT, Traits>
    

    Ebenfalls überflüssiger Unsinn. Alles. Das :: vor dem std , sowie die templateisierung des Zeichentypen, und und und.
    Völlig overengineered.

    Möglichkeiten wären cin.ignore und cin.getline.

    Letzteres ist hier Fehl am Platz.

    #include <iostream>
    #include <vector>
    #include <sstream>
    #include <limits>
    using namespace std;
    
    struct Kunde
    {
    	double x;
    	double y;
    };
    
    istream& operator>>( istream& is, Kunde& k )
    {
    	return is >> k.x >> k.y;
    }
    
    ostream& operator<<( ostream& os, Kunde const& k )
    {
    	return os << k.x << ' ' << k.y;
    }
    
    int main()
    {
    	// Repräsentiert Datei
    	istringstream stream(
    R"(nr. X   Y
    1   91  5
    2   56  77
    3   79  89
    4   12  46
    5   97  22
    6   90  9
    7   80  30
    8   62  26
    9   5   45
    10  32  36)");
    
    	stream.ignore( numeric_limits<streamsize>::max(), '\n' );
    
    	vector<Kunde> daten;
    
    	Kunde tmp;
    	while( stream.ignore(10, ' ') >> tmp )
    		daten.emplace_back(tmp);
    
    	for( auto k : daten )
    		std::cout << k << '\n';
    }
    


  • Arcoth schrieb:

    throw std::invalid_argument(std::string("Couldn't parse input"))
    

    ... wieso die Konvertierung zu string ?

    weil c++03
    falsch erinnert, hast recht, ist unnötig.

    Arcoth schrieb:

    ::std::basic_ostringstream<CharT, Traits>
    

    Ebenfalls überflüssiger Unsinn. Alles. Das :: vor dem std , sowie die templateisierung des Zeichentypen, und und und.
    Völlig overengineered.

    ups, das führende :: war nicht beabsichtigt. ist, weil ich normalerweise nichts im globalen namensbereich schreibe.



  • würde das dann bei meinem Code mit infile.ignore() oder infile.getline() funktionieren ? Bloß was müsste dann in die Klammern ?



  • ide schrieb:

    würde das dann bei meinem Code mit infile.ignore() oder infile.getline() funktionieren ?

    was steht bei mir im code in zeile 40? worauf habe ich explizit in meinem zweiten post hingewiesen? was hat Arcoth unter die dritte quote hingeschrieben? was steht in Arcoths code in zeile 39?

    ide schrieb:

    Bloß was müsste dann in die Klammern ?

    das steht in der c++-referenz deiner wahl:
    http://en.cppreference.com/w/cpp/io/basic_istream/ignore
    http://www.cplusplus.com/reference/istream/basic_istream/ignore/


Anmelden zum Antworten