Putc() wirkungslos , Text einer Datei veraendern
-
Hallo liebe Forumbenutzer .
Habe eine Frage und zwar :
Ich schreibe eine Funktion ,dass alle Großbuchstaben einer Textdatei in Kleinbuchstaben umwandelt .
Ich kann zwar jedes Zeichen auslesen und es erkennt auch ob es ein Großbuchstabe ist jedoch kann ich es nicht verändern.
Sprich die Textdatei bleibt unverändert wenn ich das Programm ausführe .Dies waere der Code :
void TextToLower(FILE *FP) //File Pointer für Funktion = Parameter { int temp; FP=fopen("Text.txt","rw"); // File Pointer wird "die Datei zugewiesen " . Außerdem wird die Datei Text.txt geöffnet in // in der bereits etwas steht if(FP==NULL) { printf("Es ist ein Fehler aufgetreten \n\n"); // Klassisches BLABLA } else { printf("Die grossgerschrieben Buchstaben sind :\n"); // Klassisches BLABLA while((temp=fgetc(FP))!=EOF) // Wird solange gemacht bis das Dateiende erreicht ist. Durch Aufruf von fgetc wird der FP um 1 groeßer {if(temp>='A'&&temp<='Z') // Falls das momentane Zeichen ein Großbuchstabe ist { printf(" %c \n",temp); // nun wird das momentane Zeichen ausgegeben. fputc(temp+32,FP); // hier " sollte " der Großbuchstabe durch einen Kleinbuchstaben ersetzt werden // daher wird zum zu temp 32 dazugezählt siehe ASCCI-Tabelle } } fclose(FP); // Datei wird geschlossen } }
Kann man mit putc nur einen Wert schreiben aber nicht veraendern ??
Oder wieso funktioniert das nicht ?Ich bedanke mich schon mal im Vorraus fuer die Hilfe .
P.s warum wird ( V o r r a u s ) zensiert ?
-
"rw" ist keine gültige Option für fopen.
Es gibt "r+" oder "w+" (und "a+") für das Öffnen zum lesen und schreiben.Zudem steht der Schreib/lesezeiger nach dem lesen auch nicht mehr auf dem gelsenen Buchstaben sondern dahinter.
Öffne eine 2. Datei zum schreiben und kopiere die Daten da rein.xXiTzAdi schrieb:
P.s warum wird ( V o r r a u s ) zensiert ?
Weil das zuviele so schreiben und das so nicht in Duden steht.
-
FILE *FP=fopen("Text.txt","r+b"); int character; while((character=fgetc(FP))!=EOF) { fseek(FP, -1, SEEK_CUR); fputc(toupper(character), FP); } fclose(FP);
-
D.h
Ich schreib statt "rw" einfach "r+" .
Ich nehme an du meinst mitnach dem lesen
den Aufruf von fgetc in der while Bedingung .
Dass der Lese bzw Schreibzeiger auch nach Aufruf von fputc um 1 weiterrückt ist mir klar .Jedoch verstehe ich nicht ganz wieso ich eine 2 Datei benötige dass wird doch wohl auch so möglich sein ?
Oha wusste gar nicht ,dass es voraus heißt wieder was dazu gelernt
.
-
Ahh das ist ja noch was dazugekommen werde es gleich mal ausprobieren ..
-
edit: Was hier stand war falsch, war nicht portabel.
-
So den Modus habe ich jetzt auf r+b geändert und in der while Schliefe die Seek- Funktion miteinbezogen . Jedoch habe ich jetzt eine Endlosschleife die mir immer den 1.ten Großbuchstaben ausgibt .
Das toupper in der seek funktion habe ich durch tolower ersetzt da ich ja die Großbuchstaben in Kleinbuchstaben umwandeln will .while((temp=fgetc(FP))!=EOF) // Wird solange gemacht bis das Dateiende erreicht ist. Durch Aufruf von fgetc wird der FP um 1 groeßer {if(temp>='A'&&temp<='Z') // Falls das momentane Zeichen ein Großbuchstabe ist { printf(" %c \n",temp); // nun wird das momentane Zeichen ausgegeben. fseek(FP,-1,SEEK_CUR); // Dadurch geht der Dateizeiger an die Position 1 davor fputc(tolower(temp),FP); // hier " sollte " der Großbuchstabe durch einen Kleinbuchstaben ersetzt werden } }
-
Statt
if(temp>='A'&&temp<='Z')
nimmst du besserif(isupper(temp))
-
DirkB schrieb:
Statt
if(temp>='A'&&temp<='Z')
nimmst du besserif(isupper(temp))
Blöde Frage und zwar wieso ist es besser statt if(temp>='A'&&temp<='Z') if(isupper(temp)) zu schreiben ??? Auf jeden Fall hab ich's gemacht . Ändert jedoch nichts an der Lage mein Problem bleibt bestehen.
. Jedoch habe ich jetzt eine Endlosschleife die mir immer den 1.ten Großbuchstaben ausgibt .
Das toupper in der seek funktion habe ich durch tolower ersetzt da ich ja die Großbuchstaben in Kleinbuchstaben umwandeln will .wäre dankbar für Hilfe
-
Ich erinnere mich düster daran, daß gemischtes Lesen und Schreiben in der selben Datei etwas problematischer sein konnte, wenn du die Dateiposition nicht zwischendurch angleichst. Da könnte ein
fflush(FP);
oderfseek(FP,0,SEEK_CUR);
möglicherweise helfen.PS: @isupper(): Es hat einfach den Vorteil, daß es klarer ausdrückt, was du willst - und es ist außerdem EBCDIC-kompatibel
-
Danke jetzt haut es hin .