Zum Inhalt springen

Einzelne Zeichen in txt-Datei ersätzen


LLpresident

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...