fstream - getline Problem
-
Wie wäres es mit einer Schlaufe + Array/std::vector?
-
Und wie würde das denn dann aussehen? Weil ich hab ehrlich gesagt keine Ahnung, wie ich das mit dem Array machen soll...
Mit der Schleife, das ist das kleinere Problem, denke ich.
-
Ein Array von strings?
std::string vokabels[1000]; // 1000 Vokabeln std::vector<std::string> vokabels2; // Dynamisches ArrayDu kannst dann ja ganz einfach auf die strings zugreifen.
for (int i = 0; i < 1000; i++) getline (InFile,vokabels[i]);So was in der Art.
-
Super! Danke

Auch gut, dass du das kommentiert hast. Jetzt gehts glaub ich auch wieder voran mit dem Programm.
-
Mit dem vector klappt das aber irgendwie nicht ganz, Der gibt mir den Fehler aus, dass vector nicht in dem Namensraum von std liegt...
Muss ich da noch etwas oben hinschreiben? Weil eigentlich verwende ich jausing namespace stdEdit: Habs jetzt, weiß was falsch war.
-
Na toll, hab schon wieder ein Problem, bei dem ich keine Lösung weiß...
Diesmal kommt folgende Fehlermeldung:
no match for 'operator<<' in 'std::cout << vokabels2'
Jedoch weiß ich nicht, was an folgendem Script falsch sein soll:std::string vokabels[1000]; std::vector<std::string> vokabels2; for (int i = 0; i < 1000; i++) { getline (InFile,vokabels[i]); } InFile.close(); system("cls"); cout <<vokabels2<<"\n";Sieht vielleicht irgendjemand den Fehler bei meinem Script?
-
Ich sehe da mehr als einen Fehler.
1. Du liest in vokabels ein willst aber vokabels2 ausgeben, welches gar nicht gefüllt ist. Was genau willst du eigentlich?
2.cout <<vokabels2<<"\n";Es existiert kein Ausgabeoperator für vector<string>. Das kannst du aber schön in einer Schleife machen (gibt noch mehr Möglichkeiten).
alsostd::vector<std::string> vokabels2; std::string tstr; for (int i = 0; i < 1000; i++) { getline (InFile,tstr); // in temporäre variable einlesen vokabels2.push_back(tstr); // in den vector kopieren } InFile.close(); // nicht zwingend nötig system("cls"); size_t size = vokabels2.size(); //Größe des vectors feststellen for( size_t i=0; i<size; ++i) cout << vokabels2[i] <<"\n"; // einzelne Elemente ausgeben
-
Danke für die Lösung. Man lernt ja bekanntlich immer dazu, und ich merke, dass das bei mir noch sehr viel ist, was ich zu lernen habe
.
-
Also so langsam frage ich mich, ob ich nicht einen einfachen Taschenrechner als Projekt(Schule) abgeben soll...
Irgendwie ist bei mir der Wurm drin. Mein neuestes Problem ist, dass die Zeilen zwar ausgelesen werden, aber direkt danach wieder verschwinden. D.h. ich seh für einen ganz kurzen Moment meine Liste, bevor sie wieder verschwindet...
Kann es daran legen, dass alles nur temporär gespeichert wird, und direkt danach wieder überschrieben bzw. gelöscht wird? Wenn ja, wie kann ich denn dann die Daten festhalten?
Hier mal das \1:#include <iostream> #include <fstream> #include <vector> using namespace std; char engvok[200]; char gervok[200]; const char* const pszDATEI = "vok_db.txt"; int main() { system("cls"); ifstream InFile; InFile.open(pszDATEI); if (!InFile) { cout << "Fehler beim Oeffnen der Datei!\n"; exit(1); } std::vector<std::string> vokabels2; // Dynamisches Array std::string tstr; for (int i = 0; i < 1000; i++) { getline (InFile,tstr); // in temporäre variable einlesen vokabels2.push_back(tstr); // in den vector kopieren } InFile.close(); system("cls"); size_t size = vokabels2.size(); // Größe des Vektors for(size_t i=0; i<size; ++i) cout <<vokabels2[i]<<"\n"; system("Pause"); }
-
Ich sehe da kein Fehler, ausser, dass du <string> inkludieren und das ganez NICHT Script nennen solltest.

Sag dem Programm, Quellcode, Code oder so, aber bitte nicht SCRIPT..
-
Danke für die Belehrung ;).
Nur komm ich leider nun einfach nicht weiter mit meinem Programm. Gibt es vielleicht sonst noch etwas einfaches konsolenbasiertes zu programmieren auf der Schwierigkeitsebene eines Taschenrechners ungefähr?
Weil ich habe einfach zu viele Probleme mit dem Vokabelprogramm...
Oder hat nicht einer zufällig noch ein Vokabelprogramm "herumliegen", welches Vokabeln aus einer txt-Datei nimmt, die komplette txt-Datei ausliest, wo man Vokabeln hinzufügen kann, und wo man halt abgefragt wird???
-
Chrisl schrieb:
Danke für die Belehrung ;).
Nur komm ich leider nun einfach nicht weiter mit meinem Programm. Gibt es vielleicht sonst noch etwas einfaches konsolenbasiertes zu programmieren auf der Schwierigkeitsebene eines Taschenrechners ungefähr?
Weil ich habe einfach zu viele Probleme mit dem Vokabelprogramm...
Oder hat nicht einer zufällig noch ein Vokabelprogramm "herumliegen", welches Vokabeln aus einer txt-Datei nimmt, die komplette txt-Datei ausliest, wo man Vokabeln hinzufügen kann, und wo man halt abgefragt wird???Bitte, bitte. Und da kommt schon die nächste. NICHT AUFGEBEN, wenn schwieriger wird oder du gerade nicht weiterkommst. Du wirst umso mehr voller Stolz sein, wenn du das hinkriegst.
Also so schwer sollte das jetzt ja nicht sein. Am besten fängst du einfach nochmal an und überlegst dir, was dein Programm alles können soll und dann, wie du das am besten umsetzt und dann fängst du an zu programmieren.
Falls du dir nicht sicher bist, wie du das umsetzen kannst, spiel einfach ein wenig mit den IO Klassen rum und schau ein wenig, wie sich die verhalten. Und wenn du das Gefühl hast es verstanden zu haben, machst du dich wieder an die Aufgabe.Wenn du in etwa so vorgehst, wie oben beschrieben, solltest du die Aufgabe hinkriegen. Wenn du konkrete Fragen hast, kannst du natürlich fragen, aber einfach die Aufgabe für dich lösen werden die meisten nicht. Du sollst ja noch was lernen und da kommst du nicht drum herum dich intensiv mit dem Problem zu beschäftigen.

-
drakon schrieb:
Wenn du konkrete Fragen hast, kannst du natürlich fragen, aber einfach die Aufgabe für dich lösen werden die meisten nicht. Du sollst ja noch was lernen und da kommst du nicht drum herum dich intensiv mit dem Problem zu beschäftigen.

War ja auch nur ein verzweifelter Versuch ;). Naja wenn ich meinen Lehrer nächste Woche einfach einen Taschenrechner als Programm vorleg, der ein bisschen mehr als Punkt-und Strichrechnung kann, werde ich bestimmt auch noch eine gute Note bekommen. Ich probier es mit dem Vokabelprogramm aber auf jeden Fall nochmal, halt nur ohne Zeitdruck ;). Denn der Wille ist da, es hinzubekommen.

-
Chrisl schrieb:
drakon schrieb:
Wenn du konkrete Fragen hast, kannst du natürlich fragen, aber einfach die Aufgabe für dich lösen werden die meisten nicht. Du sollst ja noch was lernen und da kommst du nicht drum herum dich intensiv mit dem Problem zu beschäftigen.

War ja auch nur ein verzweifelter Versuch ;). Naja wenn ich meinen Lehrer nächste Woche einfach einen Taschenrechner als Programm vorleg, der ein bisschen mehr als Punkt-und Strichrechnung kann, werde ich bestimmt auch noch eine gute Note bekommen. Ich probier es mit dem Vokabelprogramm aber auf jeden Fall nochmal, halt nur ohne Zeitdruck ;). Denn der Wille ist da, es hinzubekommen.

Naja. Glaub mir soo schwer ist das nicht, ein einfaches Vokabelprogramm zu schreiben.

Das solltest du locker an einem Tag hinkriegen und ev. einem 2 noch ein wenig Features verpassen.Also was muss dein Programm können?
- Daten einlesen -> std::ifstream
- Daten schreiben -> std::ofstream
- Dann Benutzereingaben lesen und ev. wieder schreiben -> std::ifstream/std::ofstream
- Und dann Wörter abfragen. -> std::cin / std::coutDann noch ein wenit std::string und std::vector (oder meinetwegen std::map) und die Sache ist geritzt. Da ich das eigentlich alles bei dir sehe, gehe ich davon aus, dass du in etwa weisst, was man damit anstellen kann und wie man damit umgeht. Folglich ist dein Problem bei der Planung. Du hast einfach mal darauf losgeschrieben, was meist nicht gut rauskommt.

Also kannst du einfach mal ein grobes Gerüst machen, wie dein Programm aussehen soll:- Menü - Vokabeln eingeben - Vokabeln löschen - Vokabeln abfragen - BeendenDann überlegst du dir, was du alles für Datentypen brauchst:
- std::map<std::string,std::string> Vokabels; - std::string VokabelsDB; ...Und dein Programm ist so gut wie fertig. Jetzt kommt der einfache, langweilige Teil, nämlich die Implementierung. Du musst lediglich eine Hand voll Funktionen schreiben, die dir das machen, was du willst und schon bist du fertig.

-
@Chrisl
sind in deiner Vokabeldatei vok_db.txt überhaupt 1000 Werte drin? Ändere zumindest das Einlesen so ab.while(getline (InFile,tstr)) // in temporäre variable einlesen { vokabels2.push_back(tstr); // in den vector kopieren }
-
ist das net eigentlich egal ob man da nun 1000 hinschreibt oder net??
so viel platzt nehmen die 1000 strings ja net weg^^ und solange es funktioniert.
also ich hab genau so ein programm au schon gemacht.
mit folgenden Funktionen:-vokabeln abfragen
-liste erstellen
-liste erweitern
-wörter suchenalso falls du interesse hast könnt ich dir ein paar zeilen geben..alles kriegst du nicht. Sollst ja auch noch etwas selber machen.
-
Danke für das Angebot ;).
Das mit der Anzahl ist nicht egal, musste ich jetzt auch feststellen. Ich habe ja davor eine for-Schleife benutzt, wo die Vokabeln aber direkt danach wieder verschwanden. Jetzt mit der while-Schleife klappt alles ohne Probleme. Hab es jetzt auch schon hinbekommen die Liste zu erweitern.
Aber wie hast du das mit dem Wörter suchen gemacht?
Das würd mich auch mal interessieren.
Mein Problem ist aber momentan etwas ganz anderes. Irgendwo in meinen Programm, ich schätze mal bei case 2 habe ich einen Fehler gemacht, jedenfalls passiert nichts, wenn ich im Menü auf die 3 drücke, wonach eigentlich "test" erscheinen soll. Vokabeleingabe und komplette Ausgabe habe ich aber schon :).#include <iostream> #include <fstream> #include <vector> #include <math.h> using namespace std; //Namensraum std verwenden char engvok[200]; //Textvariable mit 200 Zeichen char gervok[200]; //Textvariable mit 200 Zeichen const char* const pszDATEI = "vok_db.txt"; //konstante Variable in der Pfad zur txt-Datei gespeichert ist int main() { int x; while( x != 4 ) { system("cls"); cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"######Herzlich Willkommen zu meinem Vokabeltrainer!############\n"; cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"###############################################################\n"; cout<<"#############################Menu##############################\n" "Vokabelliste (1)\n" "Neue Vokabeln hinzufuegen (2)\n" "Abfrage (3)\n" "Exit me! (0)\n"; cin>>x; switch(x) { case 0: { system("cls"); cout <<" ///// // // // //////\n"; cout <<" // //// // // \n"; cout <<" //// // // // \n"; cout <<" // //// // // \n"; cout <<" ///// // // // // \n"; system("PAUSE"); return EXIT_SUCCESS; } case 1: { system("cls"); ifstream InFile; //falls Datei vorhanden InFile.open(pszDATEI); //dann öffnen if (!InFile) //falls nicht vorhanden { cout << "Fehler beim Oeffnen der Datei!\n"; //Fehlerausgabe exit(1); //und schließen } std::vector<std::string> vokabels2; // Dynamisches Array std::string tstr; //String erstellen while(getline (InFile,tstr)) { // in temporäre variable einlesen vokabels2.push_back(tstr); // in den vector kopieren } InFile.close(); //Den Vorgang beenden system("cls"); size_t size = vokabels2.size(); // Größe des Vektors feststellen for(size_t i=0; i<size; ++i) cout <<vokabels2[i]<<"\n"; //Da der inhalt der txt bisher nur in einer //Variablen gespeichert wurde, diese auslesen system("Pause"); break; //Programm beenden } case 2: { system("cls"); char beende2; while(beende2!='Y') { ofstream OutFile(pszDATEI, ios::app); if(!OutFile) { cout<<"Fehler beim Erstellen der Datei!\n"; exit(1); } cout<<"Die englische Vokabel bitte eintragen: \n"; cin>>engvok; cout<<"Jetzt bitte die deutsche Vokabel angeben:\n"; cin>>gervok; OutFile <<engvok<< " "<<gervok<<endl; cout<<"Willst du jetzt beenden? Andernfalls kannst du auch noch neue Vokabeln hinzufuegen!(Y/N)\n"; cin>>beende2; } if(beende2=='Y') { break; } break; } case 3: { system("cls"); cout<<"test\n"; break; } } } }Wo liegt hier der Fehler, dass case 3 nicht klappt? Bestimmt ist es irgendein dummer Fehler, nur ich sehe ihn nicht
.
-
Bring Ordnung ins Chaos. Schon klar, dass du den Fehler nicht findest, bei dem Gewirr.
Schreib ein paar Funktionen, auch wenn die lediglich was ausgeben und benutz Einrückungne. Dann findest du den Fehler selbst.
-
Also das Problem hab ich jetzt gelöst, nachdem ich mal "Ordnung ins Chaos" gebracht habe ;).
Jedoch scheitere ich jetzt an dem, was ich schon vorher als größtes Problem gesehen habe.
Ich weiß nicht, wie ich jetzt zb. das erste Wort einer x-beliebigen Zeile auslese, und die Eingabe des Benutzers dann mit dem zweiten Wort der gleichen Zeile wieder vergleiche.
Ich habe zwar schon alle Wörter in den Vektor eingelesen, doch wie es dann weiter gehen soll, davon habe ich keine Ahnung:#include <iostream> #include <fstream> #include <vector> using namespace std; char engvok[200]; char gervok[200]; const char* const pszDATEI = "vok_db.txt"; int main() { int x; while( x != 4 ) { system("cls"); ... cin>>x; switch(x) { ... case 3: { system("cls"); ifstream InFile; InFile.open(pszDATEI); if (!InFile) { cout << "Fehler beim Oeffnen der Datei!\n"; exit(1); } std::vector<std::string> vokabels2; std::string tstr; while(getline (InFile,tstr)) { vokabels2.push_back(tstr); } InFile.close(); system("cls"); //Hier weiß ich nicht weiter system("Pause"); break; } } } }
-
So was in die Richtung:
typedef std::pair<std::string,std::string> vokPair; std::map<std::string,std::string> vok; vok.insert (vokPair ("Hallo","Hello")); vok.insert (vokPair ("Fenster", "Window")); std::string in; std::cout << "Hallo" << std::endl; std::cin >> in; if(in == vok["Hallo"]) std::cout << "Richtig!!" << std::endl;