Mit GCC eine Zeile aus einer Textdatei löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
wolf4124
Beiträge: 16
Registriert: 09.04.2009 11:20:10

Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von wolf4124 » 11.04.2009 20:02:45

Hallo

ich möchte eine Zeile aus einer Textdatei löschen.
Ich arbeite im Moment mit den Befehlen fseek() zum Positionieren,
fclose() und fopen() zum Öffnen/ Schliessen.

Kann mir jemand helfen?

Gruß

wolf4124

Benutzeravatar
LessWire
Beiträge: 558
Registriert: 21.11.2004 04:36:04
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Bavaria

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von LessWire » 12.04.2009 03:29:15

Am einfachsten löscht Du eine (oder auch mehrere) Zeilen in einer Textdatei, indem Du die Datei einfach ohne die zu löschenden Zeilen neu schreibst:

- 2x fopen, jeweils für zu lesende und zu schreibende Datei
- Textdatei Zeile für Zeile lesen mit "fgets", jede noch benötigte Zeile mit "fputs" in die neue Datei schreiben
- 2x fclose

"fseek" mit entsprechend umfangreicher move-action für den Löwenanteil der verbleibenden Daten wäre eine recht ineffiziente Lösung - es sei denn, es genügt, die zu löschende Zeile nicht wirklich zu löschen, sondern nur z.B. mit Leerzeichen zu überschreiben.

Am schnellsten ging's natürlich in der Shell mit sed, awk, o.ä. Für einen Einstieg in C ist Dein Beispiel aber schon mal nicht schlecht ;-)

vg, LW.
at ~ now.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von Duff » 12.04.2009 17:08:20

Muss es C sein oder darf es auch C++ sein?
Oh, yeah!

wolf4124
Beiträge: 16
Registriert: 09.04.2009 11:20:10

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von wolf4124 » 13.04.2009 07:42:57

Hallo

eigendlich schon c weil der ganze Rest schon in c ist.

Gruß

wolf4124

wolf4124
Beiträge: 16
Registriert: 09.04.2009 11:20:10

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von wolf4124 » 13.04.2009 23:02:11

Hallo

ich bekomme es nicht so richtig hin.
Mein Codeteil

rename("/data/file/3h_Boiler", "/data/file/3h_Boiler_temp" ); //Datei Umbenennen
fs_file3h_Boiler = fopen("/data/file/3h_Boiler", "a");
fs_file3h_Boiler_temp = fopen("/data/file/3h_Boiler_temp", "r");

fseek(fs_file3h_Boiler_temp, -179, SEEK_END); //Zeiger positionieren ende + 179 wieder Richtung Anfang
while (fgets(CharPuffer1, 80, fs_file3h_Boiler_temp) != NULL)
{
fputs(CharPuffer1, fs_file3h_Boiler); //Schreiben
fseek(fs_file3h_Boiler, 1, SEEK_CUR); //Nächste Zeile
fseek(fs_file3h_Boiler_temp, 1, SEEK_CUR); //Nächste Zeile
}

Ich hab rausgefunden das die Schleife 6* durchläuft.
Die Textdatei hat mehr als die 179 Zeilen.
Kann mir mal jemand drüberschauen warum er mir nichts ausliest und das was er nicht schreibt?

Gruß

wolf4124

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von Spasswolf » 13.04.2009 23:39:08

fseek(FILE *stream, 1, SEEK_CURRENT) setzt die file position ein byte weiter, nicht eine Zeile.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von GoKi » 13.04.2009 23:48:32

wolf4124 hat geschrieben:Die Textdatei hat mehr als die 179 Zeilen.
Die Bemerkung macht mich ein wenig stutzig und auch die anderen fseek Zeilen verwundern mich. fseek positioniert byteweise und nicht zeilenweise. Des Weiteren liest fgets bis einschließlich des Newline-Symbols (falls nicht zuvor die Buffergrenze erreicht wird). Ein anschließendes

Code: Alles auswählen

fseek(fp, 1, SEEK_CUR);
überspringt das erste Zeichen der nachfolgenden Zeile.
MfG GoKi
:wq

wolf4124
Beiträge: 16
Registriert: 09.04.2009 11:20:10

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von wolf4124 » 14.04.2009 14:36:58

Ohh.

Da hab ich was übersehen.
Wie kann ich dann bestimmen welche Zeile ich auswähle?
Werden bei dem Befehl fgets und fputs die Zeilen automatisch weitergezählt?

Gruß

wolf4124

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit GCC eine Zeile aus einer Textdatei löschen

Beitrag von GoKi » 14.04.2009 15:01:52

fgets und fputs arbeiten nicht zeilenbasiert. Das Offset wird immer byteweise verschoben entsprechend der Anzahl Zeichen, die gelesen oder geschrieben wurde.
Wenn Du mit Zeilen arbeiten willst, dann musst Du selbst bis zum Zeilenende lesen, bspw. mittels fgets oder auf einem GNU-System mittels getline, siehe

Code: Alles auswählen

man 3 getline
getline kann man natürlich in ANSI-C nachprogrammieren, falls nötig. Damit ist es dann auch möglich das Offset 180 Zeilen vor das Ende zu setzen.
Hier noch ein weiterführender Link:
http://openbook.galileocomputing.de/c_v ... #Xxx999328
MfG GoKi
:wq

Antworten