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.
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.
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.
LLpresident Geschrieben 22. November 2002 Autor Geschrieben 22. November 2002 thx. hat prima geklaptt. kanst du mir noch sagen was da genau passiert?
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.
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?
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?
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...
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]
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden