Mit Punkten arbeiten
-
Jetzt habe ich folgendes Problem wenn die Datei eingelesen wird, wird nur eine Zeile angezeigt obwohl es sieben sind.
struct Point { int x, y; Point(int xx, int yy):x(xx),y(yy) {} }; int main() { ofstream fout( "mydata.txt" ); cout << "Geben Sie bitte den Namen der Ausgabedatei ein:"; string name; cin>>name; ofstream ostr(name.c_str()); if(!ostr) error("Fehler beim Oeffnen der Ausgabedatei",name); vector <Point> original_points; for( int i = 0; i < 7; ++i ) { cout << "Bitte geben sie einen x- und einen y-Wert ein: "; int x,y; cin>>x>>y; if (x >= 10000 || x <= 0 || y <= 0 || y >= 10000) {cout << "ungueltiger wert" << endl; break;} original_points.push_back( Point(x,y) ); } for (int i = 0; i < original_points.size(); ++i){ fout << original_points[i].x << ',' << original_points[i].y << endl; cout << original_points[i].x << ',' << original_points[i].y << endl;} cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; cin>>name; ifstream istr(name.c_str()); if(!istr) error("Fehler beim Oeffnen der Eingabedatei",name); string buffer; getline(istr,buffer); cout << buffer << endl; istr.close(); keep_window_open(); return 0; }
-
Du hast ja auch nur ein getline (Schleife!?). Ich verstehe aber nicht warum du eine magische 7 verwendest, wenn doch vector beliebig viele Werte verwenden kann.
Edit: Du kannst deine Werte leichter mit dem ifstream einlesen als mit Getline.
-
Laut der Übung sollen es nur sieben Werte sein. Also dann ifstream verwenden.
-
Wenn ich das schreibe sagt der Compiler es fehlt ein Semikolon auch wenn es gesetzt wird.
cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; cin>>name; ifstream istr(name.c_str()); if(!istr) error("Fehler beim Oeffnen der Eingabedatei",name); while (istr.good()) { cout << name << endl; } ifstream.close();
-
ifstream.close();sieht nicht richtig aus! ->
istr.close();
-
Habe es korrigiert doch jetzt habe ich eine Endlosschleife was nur mydata.txt ausgibt.
-
winux schrieb:
Habe es korrigiert doch jetzt habe ich eine Endlosschleife was nur mydata.txt ausgibt.
Weil du in der Schleife nichts einließst, somit ist der ifstream immer good.
Edit: Ändere beim Schreiben in die Datei das ',' in ' ' und es sollte mit dem folgenden Code funktionieren.
//Einlesen ifstream istr(name); if(!istr) cerr << "Fehler beim Oeffnen der Eingabedatei: " << name; vector<Point> lese_Punkte; while (!istr.eof()) { int x, y; if(istr >> x >> y) lese_Punkte.push_back(Point(x, y)); }
-
Das habe ich geschrieben, doch es zeigt nichts aus.
cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; cin>>name; ifstream istr(name.c_str()); if(!istr) error("Fehler beim Oeffnen der Eingabedatei",name); vector <Point> read_points; while (!istr.eof()) { int x, y; if(istr >> x >> y) read_points.push_back( Point(x,y) ); }
-
weil da auch keine Ausgabe ist... Man die Werte liegen erst im vector, den du nun für die Ausgabe durchiterieren musst und zwar von Anfang bis ende.
for(vector<Point>::iterator i = lese_Punkte.begin(); i != lese_Punkte.end(); ++i) cout << i->x << " " << i->y << endl;Und das
ifstream istr(name.c_str());wird zu das
ifstream istr(name);Der Standard kennt std::string und benötigt keinen C-String.
-
HighLigerBiMBam schrieb:
ifstream istr(name);Der Standard kennt std::string und benötigt keinen C-String.
Das ist leider an dieser Stelle erst mit C++2011 so (korrigiert), auch wenn es schon Compiler gibt, die es so umsetzen.
P.S: Dennoch würde ich Lernresistente nicht weiter füttern. Er soll erst einmal sein Buch "richtig" lesen, und keine Fragen stellen, die durch die Vorkapitel eigentlich zu 95% beantwortet sein sollten (Ich kenne das Buch nicht, aber das was ich in Google-Books quergelesen hat erweckt in mir den Eindruck, dass das Buch jedenfalls nicht so schlecht ist, das der OP beim richtigen Lesen wirklich so viele Wissenslücken haben sollte). Das man das ein oder andere Vergessen kann, okay, aber irgendwo gibt es doch Grenzen.
-
asc schrieb:
Das ist leider an dieser Stelle erst mit C++2011 so (korrigiert), auch wenn es schon Compiler gibt, die es so umsetzen.
Ich verwende das schon unterbewusst so... Hat sich beim Compilerwechsel eingeschlichen 
-
Das ist der neue Code:
struct Point { int x, y; Point(int xx, int yy):x(xx),y(yy) {} }; int main() { ofstream fout( "mydata.txt" ); cout << "Geben Sie bitte den Namen der Ausgabedatei ein:"; string name; cin>>name; ofstream ostr(name.c_str()); if(!ostr) cerr << "Fehler beim Oeffnen der Ausgabedatei" << name << endl; vector <Point> original_points; for( int i = 0; i < 7; ++i ) { cout << "Bitte geben sie einen x- und einen y- Wert ein: "; int x,y; cin>>x>>y; if (x >= 10000 || x <= 0 || y <= 0 || y >= 10000) {cout << "ungueltiger wert" << endl; break;} original_points.push_back( Point(x,y) ); } for (int i = 0; i < original_points.size(); ++i){ fout << original_points[i].x << ',' << original_points[i].y << endl; cout << original_points[i].x << ',' << original_points[i].y << endl;} ostr.close(); cout << "Geben Sie bitte den Namen der Eingabedatei ein:"; cin>>name; ifstream istr(name.c_str()); if(!istr) cerr << "Fehler beim Oeffnen der Eingabedatei" << name << endl; vector <Point> processed_points; int x,y; char c; while (!istr.eof()) { if(istr >> x >> c >> y) processed_points.push_back(Point(x,y)); } for (int i = 0; i < processed_points.size(); ++i) cout << processed_points[i].x << ',' << processed_points[i].y << endl; keep_window_open(); return 0; }