Zeile loeschen bzw. ueberschreiben in einer Text-Datei.
-
Hallo Forum,
folgendes Problem,
es wird eine Text-Datei geoeffnet und nach einen string gesucht.if ((fp = fopen(cfgconv,"r+at")) == NULL) return; while (!feof(fp)) { *call = '\0'; fscanf(fp,"%s%s",&(*call),&(*nick)); if (strcmp(cp->name,call) == FALSE)
String gefunden in Zeile 10 (nur mal als Beispiel), soll auch in
Zeile 10 wieder aktualisiert werden./* Feststellen in welcher Zeile wir sind. */ x = ftell(fp); /* Wir gehen zu der gesuchten Zeile. */ fseek(fp,x,0); /* Schreibe neue Daten in die Zeile. */ fprintf(fp,"%s %s",cp->name,cp->nickname);
Fast alles Super, leider werden die neuen daten an den alten angehaengt.
Hier ist die Text-Datei:atd233 alkan
dad213 chris
daa531 olli
ol2rie olliol2rie oliver
dd1br brecher
lpz1kt kevin
dok1st stefanSoll aber am ende so aussehen:
atd233 alkan
dad213 chris
daa531 olli
ol2rie oliver
dd1br brecher
lpz1kt kevin
dok1st stefanWelche funktion fehlt noch?
mfg Olli.
-
Öffne mal die Datei so:
fopen(cfgconv,"r+t")
Ich sehe aber da jetzt ein Problem.
Wenn der Ersetzen-String länder ist als der Suchstring,
werden Folgedaten überschrieben. Ist der Ersetzen-String
kürzer, bleiben Teile des Suchstrings bestehen.Also am besten die komplette Datei puffern und die Such-
und Ersetzenoperationen im Speicher durchführen.
-
Also am besten die komplette Datei puffern und die Such-
und Ersetzenoperationen im Speicher durchführen.und zum schluss datei neuschreiben lassen mit den Updates ?
Wenn ja ist es ziemlich aufwenig denk ich mal.Brauche nur eine funktion die mir die Zeile vorher loeschen soll, so dass
ich dann nur noch den neuen Eintrag rein kopiere.mfg Olli.
-
Hermann hat recht, mit deinr Lösung bekommst du Probleme wenn die Stringlänge beim Update sich ändert.
Wenn du nicht auf seinen Vorschlag mit der Bufferung eingehen willst, kannst du auch die Datei so definieren,
das jede Zeile die gleiche Länge hat, dann kannst du einzelne Zeilen leicht austauschen hier zum Beispiel
ist eine Record 24 Zeichen lang 10 Zeichen für den ersten Item und 14 Zeichen für den zweiten Stringatd233.... alkan........
dad213.... chris........
daa531.... olli.........
ol2rie.... olli.........
dd1br..... brecher......
lpz1kt.... kevin........
dok1st.... stefan maier.
-
dann kannst du einzelne Zeilen leicht austauschen
Genau das ist ja das Problem mit dem austauschen.
Wie geht das nun ?!mfg Olli.
-
Falls jetzt die Zeilen alle gleich lang sind
positionierst du den Filepointer auf den anfang der gewünschten Zeile
und schreibst die neuen Daten hinein. Um eine zeile zu "löschen", sollte
man sie mit einem leerinhalt überschreiben.
Um im Beispiel zu bleiben Recordlänge =24 Zeichen.- File öffnen (fp=fopen( "file", "w+" );)
- Positionieren (fseek( fp, 24L*line, SEEK_SET);) // Zeile die ausgetauscht werden soll achtung
- austauschen
- File schließenBeispiel:
int ExchangeData(char *file,//Filename char *text, // Neuer Inhalt int line) // Zeile die ausgetauscht werden soll { FILE *fp; char line[80+1]; if(NULL==(fp = fopen( file, "w+" ))) { printf( "The file %s can´t be opened\n",file ); return -1; } else { if( 0 != fseek( fp, 24L*(long int)line, SEEK_SET)) { printf( "ERROR Fseek failed" ); return -2; } else { sprintf( line,"%24.24s",text ); fputs( line, fp ); } fclose( fp ); } return 0; }