LLpresident Geschrieben 21. November 2002 Geschrieben 21. November 2002 hey. ich will in einer txt-Datei alle tab-zeichen durch "$" ersätzen.wie kann ich das anstellen? mein quelltext siht bis jetzt so aus: #include <iostream.h> #include <conio.h> #include <process.h> #include <fstream.h> #include <string.h> //------------------------------------------------------- void main() { char Zeichen; char Tab = {0x09}; char Test[] = "$"; ifstream application("application.txt", ios::in); while(!application.eof()) { application.get(Zeichen); if(Zeichen == Tab) { Zeichen = *Test; ofstream test("application.txt", ios::out); test << Zeichen; } } getch(); } dabei ersätzt er aber leider nicht das letzte ihm übergebene zeichen sondern die gesamte txt-Datei. ich wolte es zu erst mit strlen versuchen und ihm dann in einer vorschleiffe denn wert zuweisen. aber dadurch das die txt-datei variabel lang ist weiss ich leider nicht wie ich das hinbekommen soll. danke schon mal im vorraus. Zitieren
Klotzkopp Geschrieben 21. November 2002 Geschrieben 21. November 2002 Das Hauptproblem an Deinem Code ist, dass Du für jedes Zeichen in der Datei einen neue Ausgabedatei aufmachst, die, weil sie denselben Namen trägt, Deine Eingabedatei überschreibt. Du brauchst nicht ein ifstream und ein ofstream, sondern ein fstream, das beides gleichzeitig kann. Ich hab noch nicht wirklich viel mit Streams gemacht, aber ich habe ein wenig rumprobiert, und das hier scheint zu funktionieren: #include <fstream> #include <conio.h> using namespace std; //------------------------------------------------------- int main() { char Zeichen; char Tab = '\t'; char Test = '$'; fstream application("application.txt", ios::in | ios::out ); while(!application.eof()) { application.get( Zeichen ); if(Zeichen == Tab) { application.rdbuf()->pubseekoff( -1, fstream::cur ); application.put( Test ); application.rdbuf()->pubseekoff( 0, fstream::cur ); } } getch(); return 0; }[/CODE] Jemand der mehr Ahnung von Streams hat, möge mir bitte sagen, warum der zweite pubseekoff-Aufruf notwendig ist. Ohne den wächst die Datei [b]sehr[/b] schnell. Zitieren
gajUli Geschrieben 22. November 2002 Geschrieben 22. November 2002 Originally posted by Klotzkopp Jemand der mehr Ahnung von Streams hat, möge mir bitte sagen, warum der zweite pubseekoff-Aufruf notwendig ist. Ohne den wächst die Datei sehr schnell. Bei stuerzt das Programm ab. Zitieren
LLpresident Geschrieben 22. November 2002 Autor Geschrieben 22. November 2002 thx. hat prima geklaptt. kanst du mir noch sagen was da genau passiert? Zitieren
Klotzkopp Geschrieben 22. November 2002 Geschrieben 22. November 2002 @gajUli: Welchen Compiler verwendest Du? @LLpresident: Das zeichenweise Einlesen sollte ja klar sein. Wenn ich ein Tab finde, setzt ich den Dateizeiger um eins zurück (Offset -1 von der aktuellen Position, deswegen cur für current). Damit steht der Dateizeiger wieder vor dem Tabzeichen. Dann schreibe ich das Dollarzeichen in die Datei. Warum der zweite pubseekoff-Aufruf notwendig ist, weiß ich auch nicht, denn der macht im Prinzip nichts. Er setzt den Dateizeiger auf Offset 0 von der aktuellen Position, lässt ihn also auf gut Deutsch da, wo er ist. Zitieren
gajUli Geschrieben 22. November 2002 Geschrieben 22. November 2002 @klotz In diesem Fall Metrowerks Codewarrior auf iMac. Koennte es vielleicht sein, dass man einen Dateizeiger aehnlich wie in C wieder schliessen muss, wenn man fertig ist? Zitieren
Klotzkopp Geschrieben 22. November 2002 Geschrieben 22. November 2002 Originally posted by gajUli Koennte es vielleicht sein, dass man einen Dateizeiger aehnlich wie in C wieder schliessen muss, wenn man fertig ist? Erwischt. Eigentlich schon. Ein application.close() an geeigneter Stelle wäre wohl ganz angebracht. Kann sein, dass Windows da toleranter ist, aber abstürzen sollte das Programm trotzdem nicht. An welcher Stelle passiert's denn? Zitieren
gajUli Geschrieben 22. November 2002 Geschrieben 22. November 2002 Originally posted by Klotzkopp Kann sein, dass Windows da toleranter ist, aber abstürzen sollte das Programm trotzdem nicht. An welcher Stelle passiert's denn? Der Debugger bewegt sich noch lustig durch die Schleife, aber beim return passierts dann. Das .close() werd ich nachher nochmal versuchen... Zitieren
gajUli Geschrieben 23. November 2002 Geschrieben 23. November 2002 Ich schaetze, ich habs. Liegt wohl an .eof() kombiniert mit .get(int): Use the eof() function to test for an eofbit setting in a stream being processed under some conditions. This end of file bit is not set by stream opening or closing or reaching the end of the file , but only explicit operations. You should use fail() to test for file reading er- rors as it will test for end of file as well as other file reading errors. So waere es richtig: #include <fstream> //------------------------------------------------------- int main() { char Zeichen; char Tab = '\t'; char Test = '$'; fstream application("application.txt", ios::in | ios::out ); while( (Zeichen=application.get()) != EOF) { if(Zeichen == Tab) { application.rdbuf()->pubseekoff( -1, fstream::cur ); application.put( Test ); application.rdbuf()->pubseekoff( 0, fstream::cur ); } } application.close(); return 0; } [/PHP] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.