Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Einzelnes Zeichen in Datei ersetzen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
26.11.2007, 23:20 Uhr
tester34



Hallo,

wie kann ich ein einzelnes Zeichen in einer Dateu durch ein anderes ersetzen und wieder in die Datei schreiben?
C Code bevorzugt...

Vielen Dank für die Hilfe!

MfG Tobi


C++:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
using namespace std;


main()
{
  int k=100,zaehler=0;              
  FILE *dateiptr;                        
  dateiptr=fopen("datei3.21.txt","r+b");
  if(dateiptr==NULL)
  {
     cout<<"\n\tFehler beim öffnen der Datei!";  
  }
  int ersetzZeichen,c;
  cout<<"Nach welchem Buchstaben soll gesucht werden: ";
  ersetzZeichen=getchar();
  cout<<"\n";

  while ((c = fgetc(dateiptr))!= EOF)
  {
     if(c==ersetzZeichen)                
     {
        fseek(dateiptr,0,SEEK_CUR);         //Ab hier hängts bei mir...
        fputc(0x00,dateiptr);
        cout<<"Zu ersetzender Buchstabe wurde gefunden\n";
     }
  }

  fclose(dateiptr);
   system("PAUSE");
   return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.11.2007, 23:50 Uhr
0xdeadbeef
Gott
(Operator)


www.fun-soft.de/showtopic.php?threadid=18854
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.12.2007, 16:46 Uhr
tester34



Hallo,
bin langsam am verzweifeln, das Programm will mir einfach in der Datei kein Zeicehn ersetzen!
Der oben genannte thread bringt mich auch nicht weiter, es funktioniert einfach nicht!

Datei test.txt hat den Inhalt "teste".
Folglich gibt das Programm aus:

t
gefunden
e
s
t
gefunden
e

Datei erfolgreich geschlossen!


Nur in die Datei schreibt er einfach nicht!
Weder Schreibschutz noch sonst was ist aktiv...
Verwende MS Visual Studio 2005

mfg tobi


C++:
int main()
{
FILE *fd;        //Pointer der auf einen Typ FILE zeigt, also eine Datei
int c;
int d=90;            //Z in Dezimal

fd=fopen("E:\\test.txt", "r+");        
if(fd!=NULL)                            
{
    while((c=fgetc(fd))!=EOF)                    
    {
       putchar(c);
       cout<<"\n";
       if (c=='t')
       {
          cout<<"gefunden\n";
          ungetc(c,fd);
          fputc(d,fd);
       }
    }
    fclose(fd);
    cout<<"\n\n\nDatei erfolgreich geschlossen!\n\n\n";
}
else if(fd==NULL)
{
cout<<"\n\nFehler beim öffnen der Datei!\n\n";
}
system("PAUSE");
return 0;
}


Dieser Post wurde am 01.12.2007 um 16:48 Uhr von tester34 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.12.2007, 17:08 Uhr
mmc20
puss in boots


hi,

MSDN zu fopen:

...
When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update„). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.
...


in deinem ersten code hattest du das doch noch drin

C++:
fseek(dateiptr,0,SEEK_CUR);         //Ab hier hängts bei mir...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.12.2007, 17:17 Uhr
tester34



ja mit der ersten variante bin ich nicht mehr zurecht gekommen!
deswegen ein neuer versuch, nun hänge ich auch wieder....

funktioniert mein neuer anlauf vom prinzip her nicht?
was soll ich mit dem fseek anstellen?
bitte wenn möglich nur noch auf den 2ten versuch eingehen, der erste is ad acta gelegt.
Danke!

mfg tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.12.2007, 23:03 Uhr
Hans
Library Walker
(Operator)


Hi,

wenn du bevorzugt mit C arbeiten willst, dann werf erstmal die C++ Elemente aus dem Code raus, also:

C++:
#include <iostream> /* raus, weil C++ */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
using namespace std; /* raus, weil C++ */

int main()
{
FILE *fd;        //Pointer der auf einen Typ FILE zeigt, also eine Datei
int c;
int d=90;            //Z in Dezimal

fd=fopen("E:\\test.txt", "r+");        
if(fd!=NULL)                            
{
    while((c=fgetc(fd))!=EOF)                    
    {
       putchar(c);
       cout<<"\n";  /* raus, weil C++, ersetzen durch printf() oder puts() */
       if (c=='t')
       {
          cout<<"gefunden\n";    /* raus, weil C++, ersetzen wie oben */
          ungetc(c,fd);       /* <-- Fehler!  Dadurch entsteht 'ne Endlosschleife */
          fputc(d,fd);
       }
    }
    fclose(fd);
    cout<<"\n\n\nDatei erfolgreich geschlossen!\n\n\n"; /* raus, weil C++, ersetzen wie oben */
}
else if(fd==NULL)
{
cout<<"\n\nFehler beim öffnen der Datei!\n\n"; /* raus, weil C++ */
}

system("PAUSE");
return 0;
}



So geändert läuft es bei mir jedenfalls.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 01.12.2007 um 23:05 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.12.2007, 00:03 Uhr
0xdeadbeef
Gott
(Operator)


Naja - wenn Windows ungetc nicht richtig kann, schreib stattdessen halt

C++:
fseek(dateiptr, -1, SEEK_CUR);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.12.2007, 13:29 Uhr
tester34



@Hans
die c++ elemente sind nur aus bequemlichkeit drin, die eigentliche funktionalität soll in C geschrieben sein, wobei ich es später in c++ auch versuchen werde...
durch was ersetzt du ungetc, damit es funtkioniert?

@0xdeadbeef
wenn ich fseek verwende wird es eine endlosschleife!
In meine datei mit dem Inhalt "test" wurde folgendes geschrieben:

ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZesZes
ZesZesZesZesZesZesZesZesZesZesZesZesZesZes usw.

könnt ihr mir das erklären bzw. abhilfe schaffen?

danke!

mfg tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.12.2007, 13:49 Uhr
Hans
Library Walker
(Operator)



Zitat von tester34:
durch was ersetzt du ungetc, damit es funtkioniert?

Durch überhaupt nichts. - Ich hab es gestrichen. Sieh Dir doch mal Deine Schleifenkonstruktion genauer an:

C++:
    while((c=fgetc(fd))!=EOF)                    
    {
       putchar(c);
       if (c=='t')
       {
          ungetc(c,fd);  /* <-- Fehler!  Dadurch entsteht 'ne Endlosschleife */
          fputc(d,fd);
       }
    }



Du liest ein Zeichen aus der Eingabe (fgetc) und gibst es aus (putchar). Dann prüfts Du, ob es ein 't' ist. Wenn ja, dann stellst Du es in die Eingabe zurück, und gibst stattdessen ein 'Z' aus. Beim nächsten Durchlauf der Schleife liest Du wieder ein Zeichen. Und da kriegst Du dann wieder das 't' geliefert, das Du vorher zurück gestellt hast. Du stellst wieder fest, das es sich um ein 't' handelt, und stellst es wieder zurück... - verstanden?

Wenn Du das ersetzen willst, dann muss Du es an der Stelle auch verwerfen. Wenn Du also feststellst, das ist das Zeichen, das zu ersetzen ist, dann muss es da auch ersetzt werden, und nicht wieder in den Eingabestrom zurück geschoben werden.

Ach ja, bezüglich der Mischung von C und C++ noch etwas: Das kann teilweise zu unerklärlichen Phänomenen führen, die sich oft auch als schwer nachvollziehbare Fehler äussern. Desshalb sollte man das mischen sein lassen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 02.12.2007 um 13:51 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.12.2007, 16:07 Uhr
tester34



@hans
danke für deine ausführliche erklärung!
nur es hilft alles nichts, das programm funktioniert nicht!
in der datei steht "test". Als ausgabe erhalte ich:

tgefunden!

stgefunden!

Nur in der Datei wird nichts verändert!

hier mein quelltext in vs 2005:

C++:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fd;                                
int c;
int d=90;        
fd=fopen("E:\\test123.txt", "r+");        
if(fd!=NULL)                            
{
    while((c=fgetc(fd))!=EOF)                    
    {
       putchar(c);
       if (c=='t')
       {
          puts("gefunden!\n");
          fputc(d,fd);
       }
    }
}
fclose(fd);
system("PAUSE");
return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: