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 36Ich 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'; } }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.
-
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/