Zeichen durch Zeichenkette ersetzen (in Datei)
-
house123 schrieb:
Ich verstehe aber jetzt nicht wieso du datei1 und datei2 benutzt. Ich hab ja nur eine Datei die bearbeitet werden soll.
Du erstellst eine neue Datei (datei2), in der du die bestehende Datei (datei2) kopierst bzw. abänderst.
Wenn du fertig bist löscht du die alte Datei mitremove()
und änderst den Namen der neuen Datei in den der alten Datei mitrename()
house123 schrieb:
Als Ausgabe bekomme ich aber eine 0
Du hast ja auch nicht
... // Fehlerbehandlung
gemacht.
Daher kannst du nicht wissen, ob du die Datei überhaupt öffnen kannst.
-
if (fp != NULL) { while( (c=fgetc(fp)) != EOF) { if(c=='a') { anzahlA++; } } printf("%d",anzahlA); } else { printf("Fehler beim Oeffnen der Datei."); exit(EXIT_FAILURE); } fclose(fp);
Reicht das als Fehlerbehandlung?
Komme jetzt immer in den else-Zweig.
Fehlen wohl irgendwelche Rechte!?
In Windows ist aber alles gesetzt und hab das Programm auch schon mal als Adminstrator ausgeführt.
-
fgets liest das '\n' mit ein und legt es auch im String ab.
char *pc; ... pc = strchr(datei,'\n'); if (pc != NULL) *pc = '\0';
sollte das Problem beheben.
-
Jap funktioniert danke, allerdings bekomme ich jetzt bei meinem
printf("%d",anzahlA);
wieder 0 ausgegeben.
-
Dann bau doch mal in deine while-Schleife ein
printf("gelesen: %d <%c> a: %d\n", c, c, anzahlA);
-
Es passiert gar nichts. Noch nicht mal "gelesen: [...]" wird augegeben
-
Plötzlich wird auch nicht mehr der else-Zweig verwendet, irgendwas hab ich anscheinend nun komplett verbockt.
Noch mal der ganze Code:
void umlauteEntfernen(void) { char datei[200]; int c; int anzahlA = 0; char *pc; printf("Dateiname angeben: "); fgets(datei,200,stdin); char umlaute[8][8] = { "ä","Ä","ö","Ö","ü","Ü","ß","€"}; //8 Felder , jeweils 8 Zeichen FILE* fp; fp = fopen(datei,"r"); pc = strchr(datei,'\n'); if (pc != NULL) { *pc = '\0'; while( (c=fgetc(fp)) != EOF) { if(c=='a') { anzahlA++; } printf("gelesen: %d <%c> a: %d\n", c, c, anzahlA); } printf("%d",anzahlA); } else { printf("Fehler beim Oeffnen der Datei."); exit(EXIT_FAILURE); } fclose(fp); }
-
Der Code ist immer noch genauso fehlerhaft wie zuvor.
Du denkst nicht nach, wenn du deinen Code mit den hier gegebenen Hilfen änderst.
-
Du bringst da fp und pc durcheinander.
Und nur weil sowohl fp als auch pc mit NULL verglichen werden und mit der Datei zu tun haben, sind sie für völlig unterschiedliche Dinge da.pc ist für den Dateinamen da und fp für die geöffnete Datei.
Und du musst natürlich erst den Dateinamen anpassen (das '\n' entfernen) und dann damit die Datei öffnen.
Und du kannst das '\n' nur entfernen, wenn es auch vorhanden ist. Darum der Vergleich mit NULL.
Und du kannst nur aus der Datei lesen, wenn sie erfolgreich geöffnet wurde. Darum der Vergleich mit NULL.
-
Okay danke das war echt dämlich von mir.
Bin nun gerade an der Fehlerbehandlung.
Ist das so korrekt oder habe ich einen Denkfehler darin?FILE* fpin; FILE* fpout; fpin = fopen(datei1,"r"); if(fpin != NULL) //Fehlerbehandlung Lesen { fpout = fopen(datei2,"w"); if(fpout != NULL) //Fehlerbehandlung Schreiben { while( (c=fgetc(fpin)) != EOF) { fputc(c,fpout); } } else { printf("Fehler beim Oeffnen zum Schreiben der Datei."); getch(); exit(EXIT_FAILURE); } } else { printf("Fehler beim Oeffnen zum Lesen der Datei."); getch(); exit(EXIT_FAILURE); }
-------
Hier
while( (c=fgetc(fpin)) != EOF) { fputc(c,fpout); }
wird ja derzeit Datei1 in Datei2 kopiert.
Du erstellst eine neue Datei (datei2), in der du die bestehende Datei (datei2) kopierst bzw. abänderst.
Ich habe noch nicht ganz verstanden, wie das mit dem Abändern funktioniert. Also wird die Datei1 in Datei2 kopiert und dann werden die Umlaute in Datei2 geändert, oder geschieht das "auf dem Weg" von Datei1 zu Datei2?
-
In der While-schleife machst du etwa
Wenn c ein Umlaut ist, dann schreibe denn Ersatztext sonst schreibe c
Womit du die Überprüfung auf Umlaut machst ist dir überlassen.
-
Jetzt hänge ich bei dem Einlesen der Umlaute.
Habe mitchar zeichen; zeichen = getche(); printf(" = %d\n", zeichen);
herausgefunden welchen Wert ich erhalte, wenn ich ein "ä" eintippe, nämlich -124.
int ae_ein=-124; ... if(fpout != NULL) { while( (c=fgetc(fpin)) != EOF) { if (c==ae_ein) { anzahlAe++; } } printf("%d",anzahlAe); }
Funktioniert so leider nicht, woran kann das liegen?
-
OKay hat sich erledigt.
Hab das jetzt mit den Zeichensätzen gerafft.
Latin-1-Kleinbuchstaben ä = 228
Funktioniert