Mehrmaliges einlesen(von text datei) durch Schleife nicht möglich
-
ich habe ein Programm geschrieben, indem ich durch eine Wordlist, Wörter vergleiche.
Doch beim zweiten Schleifendurchgang werden keine Wörter mehr verglichen.
Könntet ihr mir behilflich sein?Hier der Code:
#include <iostream> #include <fstream> #include <cstdio> #include <string> #include <algorithm> using namespace std; int main() { ifstream file; string mainword[10] = {""}; //wörter zum scannen //wörter einlesen cout << "Woerter eingeben" << endl; for(int i = 0; i < 10; ++i) { cout << ":"; cin >> mainword[i]; cout << endl; } file.open("C:\\a\\wordlist.txt", ios_base::in); if (file.good()) { char zeile[12]; //einlesen char word[12]; //Temp wörter int len; //länge char sort1[12]; //sortierte wörter cout << "Gefundene Woerter:" << endl; //--> Schleifenanfang for(int i = 0; i <= 10; ++i) // 10 wörter { strcpy_s(word, mainword[i].c_str()); len = strlen(word); sort(word, word + len); // sortieren // An den Anfang der Datei springen file.seekg(0L, ios::beg); while (!file.eof()) { //zeilen einlesen file.getline(zeile, 12); if(strlen(zeile) == len) { strcpy_s(sort1, zeile); sort(sort1, sort1 + len); if(strcmp(sort1, word) == 0) { cout << zeile << endl; } } } } //--> Schleifenende file.close(); } cin.ignore(); cin.get(); return 0; }
-
guck dir den inhalt der variablen zwischendurch mal an. entweder durch cout anzeigen lassen oder mit einem debugger.
ein paar hinweise:
deine sort funktion sortiert die buchstaben eines wortes, keine wortliste.
du liest eine zeile ein, die aus mehreren wörtern bestehen kann und vergleichst diese mit einem einzelnen wort.
zeile 69 schließt die datei nach dem ersten durchlauf der for-schleife, in den übrigen durchläufen kann der datei-inhalt nicht ausgewertet werden.
-
mit der klasse vector könntest du dich auch anfreunden, in einen vector kann man so einiges reinpacken auch strings:
int main() { ifstream file; string path = "test.txt"; // a bisschen mehr flexibilität vector <string> woerter; // dito cout << "Woerter eingeben, Eingabe mit Leerzeile beenden:" << endl; do { string wort; getline(cin, wort); if ( wort.empty() ) break; woerter.push_back(wort); }while(cin.good()); if (0 == woerter.size() ) // wenn nix eingegeben wurde return 0; // tschaui cout << "Die folgenden Woerter werden gesucht: " << endl; for (int i = 0; i<woerter.size(); i++ ) cout << woerter.at(i) << endl; file.open (path.c_str(), ios_base::in); if (!file.good()) { cout << path << " konnte nicht geoffnet werden." << endl; return 1; } ...
ein bisschen doof ist: man muss zwei leerzeilen eingeben, um die eingabe zu beenden, also zweimal enter drücken. ich weiss aber bisher noch nicht wieso. einmal wäre optimal.
-
*0r schrieb:
ein bisschen doof ist: man muss zwei leerzeilen eingeben, um die eingabe zu beenden, also zweimal enter drücken. ich weiss aber bisher noch nicht wieso. einmal wäre optimal.
das liegt an meinem asbach uralt compiler. habs jetzt mal mit nem anderen gecheckt, damit funtkioniert es.
-
auch ruhig mal angewöhnen, das programm in teilaufgaben zu zerlegen und diese auf funktionen/klassen aufzuteilen. da kommt man früher oder später nicht drum rum, wenn man sich keinen wolf scrollen will.
hier hab ich mal ne funktion für meldungen, die einen rückgabewert weiterreicht und ne eingabefunktion für die konsole:#include <iostream> #include <vector> #include <string> using namespace std; bool console_words_input ( vector <string>& w ) { string word; do { getline(cin, word); if ( word.empty() ) break; w.push_back(word); }while(cin.good()); return w.size() > 0; } int finish ( string msg, int ret ) { cout << msg << endl; system ("pause"); return ret; } int main() { vector <string> words; if ( false == ( console_words_input(words) )) return finish ("Can't proceed, no words read.", 0); cout << "The following words were read: " << endl; for (int i=0; i<words.size(); i++) cout << words.at(i) << endl; return finish ("\nProgram terminated successfully.\n",0); }
-
hier mal ne funktion, die eine textdatei einliest und die zeilen in einem vector speichert:
int finish ( string msg, int retval ) { if ( false == msg.empty() ) cout << msg << endl; system ("pause"); return retval; } bool ret ( string msg, bool retval ) { if ( false == msg.empty() ) cout << msg << endl; return retval; } bool read_textfile_lines ( string path, vector <string>& lines ) { ifstream file; string line; file.open(path.c_str(), ios_base::in); if ( file == NULL ) return ret ( path + " not found.", false ); while ( getline( file, line, '\n' )) lines.push_back (line); file.close(); return true; } int main() { string path ("test.txt"); vector <string> lines; if ( false == read_textfile_lines ( path, lines )) return finish ( "Reading " + path + " failed.", 1 ); cout << "The following lines are in the file " << path << endl; for (int i=0; i<lines.size(); i++) cout << lines.at(i) << endl; return 0; }
die nächste funktion hätte dann z.b. die aufgabe, die eingelesenen wörter in den zeilen zu suchen.
-
*0r schrieb:
deine sort funktion sortiert die buchstaben eines wortes, keine wortliste.
Das ist ja auch Sinn der Sache.
*0r schrieb:
du liest eine zeile ein, die aus mehreren wörtern bestehen kann und vergleichst diese mit einem einzelnen wort.
Ich sortiere beide Wörter, die eingegebene und das Wort in der Wordlist.
*0r schrieb:
zeile 69 schließt die datei nach dem ersten durchlauf der for-schleife, in den übrigen durchläufen kann der datei-inhalt nicht ausgewertet werden.
Falsch die Datei wird nach dem verlassen der Schleife geschlossen, schau mal wie viele Semikolon geöffnet und wieviele geschlossen wurden, vor "File.close()".
-
Falsch die Datei wird nach dem verlassen der Schleife geschlossen, schau mal wie viele Semikolon geöffnet und wieviele geschlossen wurden, vor "File.close()".[/quote]
stimmt, das hab ich verpeilt.
wozu werden die buchstaben der wörter vor dem verleich sortiert?
-
Damit ich sie vergleichen (kann!), zuerst werden die Wörter mit der gleichen länge gefiltert, dann werden sie sortiert, damit ich Wörter die vermischt wurden(z.B.: "86753421 = 12345678 oder cssaei = cassei usw" finden kann.
Doch das funktioniert nur beim ersten mal, weiß nicht wieso.
-
hab eine Lösung gefunden.
//--> Schleifenanfang for(int i = 0; i < mainword.size(); ++i) // 10 wörter { strcpy_s(word, mainword[i].c_str()); len = strlen(word); sort(word, word + len); // sortieren // An den Anfang der Datei springen file.seekg(0, ios_base::beg); while (!file.eof()) { //zeilen einlesen file.getline(zeile, 12); if(strlen(zeile) == len) { strcpy_s(sort1, zeile); sort(sort1, sort1 + len); if(strcmp(sort1, word) == 0) { cout << zeile << endl; } } } file.seekg(0, ios_base::end); //<< das hat gefehlt } //--> Schleifenende