Text zeilenweise lesen - was stimmt an meinem Code nicht ?
-
Hallo,
ich versuche gerade eine Textdatei zeilenweise zu lesen und dann in angeänderter Form wieder in eine andere Datei zu schreiben.
bisher hab ich folgenden Code:
void manageLine(char line[2000]){ cout << "\n\n\n\n\n\n" << line << "\n\n\n\n\n\n"; }// writeBackToFile - manage line and write back to output file void manageLDIF(){ char buffer[2000]; buffer[0] = 12; bool firstFlag = false; fstream input_file(filePathOpen,ios::in);//open file for read access fstream output_file(filePathSave,ios::out);//open file for write access if (firstFlag == false){ firstFlag = true; input_file.getline(buffer,2000); //manageLine(buffer); }//process first line while(){ input_file.getline(buffer,2000); }//process rest of file input_file.close(); output_file.close(); }//manageLDIF - main file process method
Leider lässt sich dieser nicht so kompilieren, wobei ich mir ziemlich sicher bin das ich keine Syntax-Fehler drin hab. Ich arbeite mit DEVC++, der neusten Beta. Ich glaub allerdings auch nicht das es ein Kompiler-Fehler ist.
Stimmt etwas mit meinem Code nicht ???Für Hilfe wär ich dankbar,
Gruß
G.Ben
-
PS, die entsprechenden Header hab ich natürlich eingebunden.
-
zeig doch die Fehlercodes einfach mal an. Das würde enorm helfen beim beantworten der Frage
wmfrs <-- lesen!while()
das geht so nicht. Entweder while(1) oder for(;; ) für endlos schleifen. Aber beachte, dass du irgend wann die Schleife beenden musst, wenn nichts mehr in der Datei steht.
input_file.close(); output_file.close();
lass das weg, dass passiert automatisch
btw.
musst du in C++ nicht alle Variablen am Anfang eines Scopes definieren. Definier die am besten immer so spät wie möglichstd::getline und std::string helfen dir wahrscheinlich bei deiner Aufgabe mehr, als das C-String-gefummel
fstream input_file(filePathOpen,ios::in);//open file for read access fstream output_file(filePathSave,ios::out);//open file for write access
warum übergibst du filePathOpen/filePathSave nicht als Parameter? Das sind doch nicht etwas globale Variablen?
http://tutorial.schornboeck.net/inhalt.htm <-- auch lesen!
-
@kingruedi: auch auf die Gefahr hin, daß ich Dich wiederhole (sorry)
@G.Ben: was ist den bei Dir 'filePathOpen'??
vielleicht hilft dir das:void manageLDIF(){ char buffer[2000]; buffer[0] = 12; bool firstFlag = false; char * filePathOpen="H:/outf/open.txt", * filePathSave="H:/outf/save.txt"; fstream input_file(filePathOpen,ios::in);//open file for read access /*warum nicht gleich: ifstream input_file(filePathOpen); */ fstream output_file(filePathSave,ios::out);//open file for write access /*warum nicht gleich: ofstream input_file(filePathSave); */ if (firstFlag == false){ firstFlag = true; input_file.getline(buffer,2000); //manageLine(buffer); }//process first line while(0/*hier fehlt doch was*/){ input_file.getline(buffer,2000); }//process rest of file //input_file.close(); //ich glaube man braucht kein explizites close() bei fstreams //output_file.close(); }//manageLDIF - main file process method
-
Danke für eure Antworten.
Ich kann keine explizite Fehlermeldung angeben, weil es keine gibt.
Das Problem is das wenn ich kompilieren, DEVC++ die Header-Datei fstream.h öffnen und mit diese Zeile makiert ohne nähere Erklärung:include "backward_warning.h"
Daher kann ich den Fehler auch nicht näher eingrenzen. Das mit der while-schleife stimmt natürlich, das kommt aber erst später.
Und ja die File-Vars sind global, wobei das aber kein Problem sein dürfte.Ich werd mir mal die Änderungen anschaun und ausprobieren.
Danke nochmal,
G.Ben
-
du verwendest die veralteten Header
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=iostream#Answ
-
Vielen dank für diesen Tip, er hat meine Probleme gelöst !!
Ausserdem hab ich nun die manageLDIF-Methode nochmal umgeschrieben.Sieht nun so aus:
void manageLDIF(char filePathOpen[1024], char filePathSave[1024]){ char buffer[2000]; ifstream input_file(filePathOpen);//open file for read access ofstream output_file(filePathSave);//open file for write access while (input_file.eof()){ input_file.getline(buffer,2000); manageLine(buffer); }//process file }//manageLDIF - main file process method
Danke an euch,
gruß G.Ben.
-
warum char foo[1024] und nicht char *foo
es macht ja keinen Sinn so die Pfade zu beschränken.
btw. std::string solltest du dir angucken und schau dir nochmal deine while Bedingung an
-
wie wäre es mit
while( !(input_file.eof()) ){...}
oder noch besser:
while( input_file.getline(buffer,2000) ){...}
-
Okay ihr habt natürlich recht was die while-schleife angeht
Wenn ich ehrlich bin bin ich noch nicht so sicher im rumpointern. Deswegen hab ich mir einfach ein char[] mit fester größe genommen.
Könnt ihr mir vielleicht ein kleines Beispiel zeigen ?
-
-
Beispiel wofür?
meinst Du vielleicht das:void manageLDIF(char * filePathOpen, char * filePathSave){...}
und der Rest bleibt genauso
-
Okay, ich habs nun mit char* gemacht. Das einzige Problem das ich bei der Lösung sehe, is das der Kompiler einem nicht mehr eine Fehlermeldung schmeißt wenn man z.B. den Bereich des Arrays verlasst.
Aber da muss man wohl einfach aufpassen.
Danke,CU