Forum: PC-Programmierung C: In Files löschen / schreben


von zitter_ned_aso (Gast)


Lesenswert?

Hallo,

wie kann man eigentlich in Files bestimmte Zeilen löschen? In den 
Büchern (Tutorials) wird ja beschreiben wie man Dateien öffnet / 
erstellt.

Aber wie kann man eine Datei öffnen und dann z.B. die erste Zeile 
löschen (in Standard-C).

Oder an bestimmter Position Text in eine (bereits vorhandene) Datei 
einfügen?

Mit fseek klappt es irgendwie auch nicht. Ich dachte das würde 654321 
ergeben.(es ergibt aber 123456)
1
   FILE* fp=fopen("text.txt", "a+");  
2
                                                                                                                                                               
3
   fputc('1', fp);                                                      
4
   fseek(fp, -1, SEEK_CUR);                                             
5
   fputc('2', fp);                                                      
6
   fseek(fp, -2, SEEK_CUR);                                             
7
   fputc('3', fp);                                                      
8
   fseek(fp, -3, SEEK_CUR);                                             
9
   fputc('4', fp);                                                      
10
   fseek(fp, -4, SEEK_CUR);                                             
11
   fputc('5', fp);                                                      
12
   fseek(fp, -5, SEEK_CUR);                                             
13
   fputc('6', fp);                                                      
14
                                                                        
15
   fclose(fp);

von zitter_ned_aso (Gast)


Lesenswert?

ähm, das wäre von der Idee her wohl sinnvoller:
1
   
2
   fputc('1', fp);                                                      
3
   fseek(fp, -1, SEEK_CUR);                                             
4
   fputc('2', fp);                                                      
5
   fseek(fp, -1, SEEK_CUR);                                             
6
   fputc('3', fp);                                                      
7
   fseek(fp, -1, SEEK_CUR);                                             
8
   fputc('4', fp);                                                      
9
   fseek(fp, -1, SEEK_CUR);                                             
10
   fputc('5', fp);                                                      
11
   fseek(fp, -1, SEEK_CUR);                                             
12
   fputc('6', fp);

aber es funktioniert ja auch nicht.

von Dirk B. (dirkb2)


Lesenswert?

Das geht nicht.

Es wird der benötigte Teil in eine neue Datei kopiert, die alte 
gelöscht, die neue umbenannt.

von zitter_ned_aso (Gast)


Lesenswert?

fseek kann man beim Schreiben gar nicht benutzen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

zitter_ned_aso schrieb:
> fseek kann man beim Schreiben gar nicht benutzen?

Doch, kannst du - aber das hilft dir nicht. Du kannst damit eine Zeile 
durch eine gleich lange andere überschreiben, wenn du willst, aber du 
kannst nach fseek() keine Zeile löschen oder einfügen.

: Bearbeitet durch Moderator
von Johannes S. (Gast)


Lesenswert?

das fopen(,"a+") öffnet die Datei doch im Textmodus, da gelten für das 
fseek() etwas andere Regeln. Öffne die mal mit "a+b" im binary mode.

http://www.cplusplus.com/reference/cstdio/fseek/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Das hilft trotzdem nichts. Es gibt keine Methode in C, mit der man in 
Dateien Bereiche entfernen oder einfügen könnte. Das muss man schon "zu 
Fuß" machen.

von zitter_ned_aso (Gast)


Lesenswert?

ja, fseek lässt die Position auch beim Schreiben ändern, aber

Jörg W. schrieb:
> aber das hilft dir nicht
1
                                                                      
2
   FILE* fp=fopen("text.txt", "w");                                     
3
                                                                        
4
                                                                        
5
   fputc('1', fp);                                                      
6
   fputc('2', fp);                                                      
7
   fputc('3', fp);                                                      
8
   fputc('4', fp);                                                      
9
   fputc('5', fp);                                                      
10
                                                                        
11
   rewind(fp);                                                          
12
   fputc('a', fp);                                                      
13
   fputc('b', fp);                                                      
14
                                                                        
15
                                                                        
16
   fclose(fp);

das ergibt einfach: ab345.
Die alten Daten werden überschrieben. Alles klar, danke.

von Johannes S. (Gast)


Lesenswert?

das schon. In dem Beispiel dürfte nur ein Zeichen in der Datei übrig 
bleiben, das letzte weil der Zeiger ja immer wieder zurückgesetzt wurde.

von zitter_ned_aso (Gast)


Lesenswert?

Johannes S. schrieb:
> In dem Beispiel dürfte nur ein Zeichen in der Datei übrig
> bleiben,

ja, das stimmt.

Im "w"-Modus steht da nur das letzte Zeichen (wenn man nach jeder 
Zeichen-Ausgabe einen Schritt zurückgeht).

Einfach nur was dazwischen quetschen, geht so nicht.

von Rolf M. (rmagnus)


Lesenswert?

zitter_ned_aso schrieb:
> wie kann man eigentlich in Files bestimmte Zeilen löschen?

Gar nicht.

> In den Büchern (Tutorials) wird ja beschreiben wie man Dateien öffnet /
> erstellt.
>
> Aber wie kann man eine Datei öffnen und dann z.B. die erste Zeile
> löschen (in Standard-C).

Indem man die Datei bis auf diese Zeile komplett neu schreibt.

> Oder an bestimmter Position Text in eine (bereits vorhandene) Datei
> einfügen?

Auch das geht nicht. Du musst dann alles, was danach kommt, auch nochmal 
neu in die Datei schreiben.

Eine Datei ist im Prinzip so ähnlich wie ein Array, nur dass es auf der 
Festplatte ist statt im RAM und dass es nur einen einzelnen Zeiger gibt, 
über den man darauf zugreifen kann. Mit fseek wählst du dabei, wohin 
dieser zeigen soll.

Beitrag #6325898 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.