Daten aus Textdokument auslesen und in vector schreiben
-
ich habe es nun so verstanden das folgende zeile alle daten aus der datei in den vector einliesst:
vector<Vliegreizen> v( (istream_iterator< Vliegreizen >( file )), istream_iterator< Vliegreizen >() );ich möchte mir jetzt einfach ausgaben lassen was in dem vector ist
vector <Vliegreizen>::iterator pos; for (pos = v.begin(); pos != v.end(); ++pos){ cout << *pos << endl; }bekomme hier aber immer folgende fehlermeldung:
error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Vliegreizen' (or there is no acceptable conversion)ich verstehe nicht wo der fehler ist!
-
Na, steht doch da: Es wird kein Operator namens << gefunden, der auf der rechten Seite ein Objekt vom Typ Vliegreizen nimmt. Denk dir doch mal, was bei folgendem Code passieren würde:
Vliegreizen foo; cout << foo;Würde das funktionieren? Nein, das würdest du auch gar nicht erst versuchen. Was du nämlich vorher brauchst, ist eine entsprechende Überladung für den Operator <<. Dies kann zum Beispiel so aussehen:
ostream& operator<<(ostream &out, const Vliegreizen& foo) { // Hier gibst du foo in out aus, so wie du es dir vorstellst return out; }Dann funktioniert das auch. Achte dabei auf die Sichtbarkeit der Member von foo, denn es handelt sich bei dem Operator um eine freie Funktion.
-
gibt es niemanden der mir weiter helfen kann?
-
PauleJS schrieb:
gibt es niemanden der mir weiter helfen kann?
Du hast doch eine Erklärung des Problems und einen Lösungsansatz erhalten.
-
PauleJS schrieb:
gibt es niemanden der mir weiter helfen kann?
Hallo PaulJS,
in der Antwort von SeppJ steht doch schon die Lösung für Dein Problem. Wenn Du was nicht verstehst, so musst Du schon konkreter fragen.Gruß
Werner
-
tut mir leid wegen dem letzten kommentar, habe immer nur die erste seite gesehen!
ich glaube ich habe nun langsam verstanden wie es funktioniert!
wollte das nun noch mit einer toString methode lösen, wo die ausgabe definiert wird.ist dieser ansatz so richtig? oder gibt es einfachere wege hierbei zum ziel zu kommen?
std::ostream& operator<<(std::ostream& os, const Vliegreizen& v){ os << v.toString(); return os; }ausserem bekomme ich hier noch die fehlermeldung:
error C2601: 'operator <<' : local function definitions are illegal
-
PauleJS schrieb:
ist dieser ansatz so richtig? oder gibt es einfachere wege hierbei zum ziel zu kommen?
Das ist eine gute Idee und auch ein sehr häufig benutzter Ansatz. Die andere übliche Methode ist es, den Operator zum friend der Klasse zu machen.
ausserem bekomme ich hier noch die fehlermeldung:
error C2601: 'operator <<' : local function definitions are illegalDas geht aus dem Code nicht hervor, woran das liegt. Es klingt danach, als würdest du versuchen den Operator innerhalb einer anderen Funktion zu definieren. Überprüf mal, ob alle Klammern in deinem Programm richtig gesetzt sind.
-
da mein code total unstrukturiert war, habe ich einfach neu angefangen!
habe aber nun am anfang schon direkt tolle fehlermeldungen bekommen:
error C2512: 'std::vector' : no appropriate default constructor available
vliegreizen.h(11) : error C2065: 'string' : undeclared identifier
vliegreizen.h(11) : error C2065: 'string' : undeclared identifierheader vliegreizen
#include <fstream> // open file #include <iostream> #include <vector> class Vliegreizen{ private: int gewicht; int gewichtTotaal; int id; int groepsKode; std::vector<string> data; public: Vliegreizen(); void loadAanvragen(); void verwerkAanvragen(); void reserveringen(); void annuleringen(); };#include "Vliegreizen.h" using namespace std; Vliegreizen::Vliegreizen(){ int gewicht = 0; int gewichtTotaal = 0; } void Vliegreizen::loadAanvragen(){ ifstream readFile( "Aanvragen.txt" ); if( !readFile.is_open() ) { cout << "Cannot open file" << endl; } else { cout << "Open file" << endl; } char zeile [30]; // max 30 characters while(readFile.getline (zeile, 500)){ //data.push_back(zeile); } readFile.close(); }ich verstehe nicht was ich hier falsch gemacht haben soll! in meinem buch kann man einen vector so benutzen.
-
PauleJS schrieb:
error C2512: 'std::vector' : no appropriate default constructor available
vliegreizen.h(11) : error C2065: 'string' : undeclared identifier
vliegreizen.h(11) : error C2065: 'string' : undeclared identifierSchau dir einmal diese 3 Fehlermeldungen an. C2065 bedeutet : "Der angegebene Bezeichner wurde nicht deklariert".
Du includierst zwar<vector>, jedoch nicht<string>. Da du außerdem vernünftigerweise keinusing namespace std;in die Header-Datei geschrieben hast, sollte es anschließend auchstd::vector<std::string> data;heißen.
-
Vicious Falcon schrieb:
PauleJS schrieb:
error C2512: 'std::vector' : no appropriate default constructor available
vliegreizen.h(11) : error C2065: 'string' : undeclared identifier
vliegreizen.h(11) : error C2065: 'string' : undeclared identifierSchau dir einmal diese 3 Fehlermeldungen an. C2065 bedeutet : "Der angegebene Bezeichner wurde nicht deklariert".
Du includierst zwar<vector>, jedoch nicht<string>. Da du außerdem vernünftigerweise keinusing namespace std;in die Header-Datei geschrieben hast, sollte es anschließend auchstd::vector<std::string> data;heißen.o man ich brauche noch viel übgung in c++^^ hast total recht gehabt und nun arbeitet es fehlerfrei
besten dank!
-
will jetzt ab zeile 1 in einem abstand von jeweils 5 zeilen immer eine neue zeile mit einem int wert hinzufügen! bekomme aber immer fehlermeldungen, oder die schleife ist unendlich lang.
lese also folgende datei ein:
Andreas Müller 95 1 Fussball Verein HSV 8763 34 Kegelclub SIXT 1264 15dazu dieser code
#include <fstream> #include <string> #include <vector> #include <iostream> using namespace std; void main (void){ string test = "test"; vector<string> data; ifstream readFile( "inFile.txt" ); char zeile [30]; // max 30 characters while(readFile.getline (zeile, 500)){ data.push_back(zeile); } vector<string>::iterator pos; data.at(1) = data.push_back(test); //beginnend von zeile 1 soll in abstand von 5 zeilen eine neue zeile eingefügt werden for (pos = data.begin(); pos != data.end(); ++pos){ cout << *pos << endl; } readFile.close(); }dieses beispiel soll jetzt erstmal nur einen string einfügen. später soll aber eine int eingefügt werden, denke dieser muss dann erst in einen string konvertiert, oder nicht?
besten dank im voraus für die hilfe!!
-
PauleJS schrieb:
// ... char zeile [30]; // max 30 characters while(readFile.getline (zeile, 500)){Hallo PauleJs,
wieso dieser Code - wo lernt man sowas? Niemand hier hat Dir geraten, char-Arrays zu benutzen. Man macht nur Fehler - so wie Du in diesem Fall.
Wir haben hier gearde einen ellenlangen Thread zum Thema string versus char[].
ratlos

Werner