Probleme mit eof
-
Hi!
Folgendes Problem: Ich möchte mir aus einer Textdatei den Text holen und in eine Variable speichern. Ich habe dazu eine Methode HoleText() geschrieben. Das Problem ist nun, dass das Ende der Textdatei nie erreicht wird und eof immer true ist.
Warum das Textende nie erreicht wird, ist mir komplett schleierhaft.
Hier der Code:CString CWegmessung::HoleText(){ CString text(""); //Textdatei zum Lesen öffnen ifstream textdatei("test1.txt", ios::in); if(!textdatei) { //Hier kommt noch Exception-Handling hinzu! TRACE(_T("Fehler beim Öffnen der Datei!")); } //Länge der Textdatei bestimmen textdatei.seekg (0, ios::end); length = textdatei.tellg(); textdatei.seekg (0, ios::beg); //Neues Vektorobjekt mit Größe abhängig von Zeichenanzahl anlegen char *buffer = new char[length]; //Anzeigen, an welcher Pos. der Cursor sich momentan befindet int f = textdatei.tellg(); //Speichern der Zeilenanzahl u. speichern des Textes while(!textdatei.eof()) { textdatei.getline(buffer, length); text += buffer; text.Append(_T(" ")); } //Schließen der Textdatei textdatei.close(); delete buffer; return text; }Die while-Schleife mit der Bedingung !textdatei.eof() ist die Endlosschleife, die nie verlassen wird.
Ich wär echt dankbar für ein paar Tipps WinkWas ich vergessen habe zu erwähnen: Die Textdatei beinhaltet nur eine Zeile. Ich habs mit mehreren Zeilen versucht und da scheint es zu funktionieren. Komisch, oder?
mfg enne
-
du brauchst hierfür noch den Header <string> damit das hier funktioniert:
CString CWegmessung::HoleText(){ CString text(""); //Textdatei zum Lesen öffnen ifstream textdatei("test1.txt", ios::in); if(!textdatei) { //Hier kommt noch Exception-Handling hinzu! TRACE(_T("Fehler beim Öffnen der Datei!")); } string line; int lines = 0; //Speichern der Zeilenanzahl u. speichern des Textes while(getline(textdatei,line)) { text += line.c_str(); text.Append(_T(" ")); ++lines; } return text; }
-
Diesen Artikel fand ich zu diesem Thema klasse:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ
-
Knuddlbaer schrieb:
Diesen Artikel fand ich zu diesem Thema klasse:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ
Jo der ist auch super

BR
Vinzenz
-
hm... Also CString ist doch IMHO MFC oder ?! std::string kommt doch aus dem <string>-Header. Oder hast du da was selbst definiert ?
-
CodeFinder schrieb:
hm... Also CString ist doch IMHO MFC oder ?! std::string kommt doch aus dem <string>-Header. Oder hast du da was selbst definiert ?
Wo ist jetzt das Problem? Der hat nichts selbstdefiniert. Ehrlich verstehe ich grad nicht was die Frage grad soll

BR
Vinzenz
-
evilissimo schrieb:
Wo ist jetzt das Problem? Der hat nichts selbstdefiniert. Ehrlich verstehe ich grad nicht was die Frage grad soll

Also ich kenn den Datentyp CString...siehe hier:
CString text("");Nur aus den MFC Headern, nicht aber aus den Stdandard C++ Headern.
Kannst mir mal den Header nennen in dem der definiert ist ?
-
Zuerst vielen Dank für die vielen Antworten. Blöderweise hab ich die Header <string.h> bereits eingebunden, also an dem liegts nicht. Normalerweise funktioniert das ganze auch, nur mit einer Zeile in meiner Textdatei geht es nicht, da eof nicht erreicht wird.
Ich hab mir den Link noch nicht angeschaut, werd ich aber sofort machen.CodeFinder hat übrigens recht, hier handelt es sich um MFC, das CString hab ich total übersehen, sonst hätte ich mein Problem in das andere Forum gepostet

mfg enne
-
Danke evilissimo für das Beispiel, scheint nur so als bräuchte getline() in MFC 3 Parameter

-
CodeFinder schrieb:
evilissimo schrieb:
Wo ist jetzt das Problem? Der hat nichts selbstdefiniert. Ehrlich verstehe ich grad nicht was die Frage grad soll

Also ich kenn den Datentyp CString...siehe hier:
CString text("");Nur aus den MFC Headern, nicht aber aus den Stdandard C++ Headern.
Kannst mir mal den Header nennen in dem der definiert ist ?
Ja und das ist doch egal, das ist doch hier überhaupt nicht das Problem. Die Frage die der OP hatte war auf Standard C++ bezogen. ( ifstream und eof )
Ob der OP nun MFC verwendet oder nicht tut doch nichts zur Sache.
Dein Problem ist kein MFC Problem
Daher ist das schon das richtige Forum. (Sonst hätte ich das schon verschoben)Nur zu deiner Information string.h ist nicht die Headerdatei die ich meinte. Ich meinte <string> (ohne .h)

BR
Vinzenz
-
enne87 schrieb:
Danke evilissimo für das Beispiel, scheint nur so als bräuchte getline() in MFC 3 Parameter

Also wenn das einen dritten Parameter brauch dann übergib '\n' (Normalerweise sollte der dritte Parameter ein default Parameter sein.)
while(getline(textdatei,line,'\n')){...BR
Vinzenz
-
Ok, ich hab jetzt auch <string> eingebunden und geschrieben:
while(getline(textdatei,line)) { text += line.c_str(); text.Append(_T(" ")); ++lines; }Jetzt bekomm ich nur die Fehlermeldung:
"std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "std::basic_istream<_Elem,_Traits> &" konnte nicht von "std::ifstream" hergeleitet werden.
-
Welchen Compiler benutzt du?! Du kannst natürlich versuchen, das Template-Argument explizit anzugeben, aber eigentlich sollte es auch so funktionieren. Ist das die ganze Fehlermeldung?
(explizit sähe das so aus:getline<char, std::char_traits<char>, std::allocator<char> >(file, line), nicht sehr elegant.)
-
Unglaublich , es klappt
Danke vielmals für die Hilfe 
-
Noch eine Frage hätte ich:
Ich hätte gerne die Anzahl der Zeichen von jeder Zeile. Wie ungefähr müsste ich dazu den Code erweitern?
-
line.length();
-
Das ging jetzt einfacher als ich dachte, danke
