Mit Punkten arbeiten
-
winux schrieb:
Jetzt verstehe was ihr meint. Da der Vektor ein benutzerdefinierte Typ ist hat cout Probleme die Werte auszugeben, die Lösung wäre ein benutzerdefinierter Ausgabeoperator.
Deine Lösung is richtig, dein Verständnis leider nicht;-)
Nicht cout hat irgendein Problem damit, sondern der Compiler, da der <<-Operator so nicht auf deine Klasse angwendet werden kann, weil das ganze weder deklariert noch definiert ist. Musst also wie meine Vorredner schon gesagt haben und du richtig erkannst hast, den <<-Operator für deine Klasse überladen.Lg freeG
-
Jetzt brauch ich eure Hilfe, was mache ich hier falsch?
void f() { ostream& operator<<(ostream os, const vector <Point>& original_points) { for ( int i = 0; i < original_points.size(); ++i) return os << original_points[i] << "\n"; } 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) ); } cout << original_points; }
-
Du hast einfach noch nicht verstanden was ein Klasse ist, das ist der einzige fehler

-
Eins verstehe ich nicht im Buch stecht so was:
for (int i = 0; i< points.size(); ++i) ostr << '(' << points[i].x << ',' << points[i].y << ")\n";Langsam verstehe ich was ihr meint, es hat kein Zugang zur klasse.
-
FRAGS ===== Jürgen Wolf: 3583 Bjarne Stroustrup: 1 Stanley Lippman: 0 Ulrich Breymann: 0
-
So habe eine neues Projekt gemacht, und einen einfacheren Code genommen.
#include "std_lib_facilities.h" #include <fstream> using std::ofstream; using std::endl; 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 << "Geben Sie bitte den Namen der Eingabedatei ein:"; cin>>name; ifstream istr(name.c_str()); if(!istr) error("Fehler beim Oeffnen der Eingabedatei",name); keep_window_open(); return 0; }
-
Warum öffnest du 3 Dateien und verwendest nur eine?
-
Die Übung sagt zuerst in die Datei reinschreiben dann wieder öffnen und die Werte in einen Vektor speichern. Bei Google fand ich den ofstream fout. Wie es aussieht hat der Code paar Fehler, aber das ist mein erstes Programm das in eine Datei schreiben und lesen soll. Anfänger Fehler.
-
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; }