Mit GCC eine Zeile aus einer Textdatei löschen
Mit GCC eine Zeile aus einer Textdatei löschen
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
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
- 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
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.
- 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.
Re: Mit GCC eine Zeile aus einer Textdatei löschen
Muss es C sein oder darf es auch C++ sein?
Oh, yeah!
Re: Mit GCC eine Zeile aus einer Textdatei löschen
Hallo
eigendlich schon c weil der ganze Rest schon in c ist.
Gruß
wolf4124
eigendlich schon c weil der ganze Rest schon in c ist.
Gruß
wolf4124
Re: Mit GCC eine Zeile aus einer Textdatei löschen
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
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
-
- 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
fseek(FILE *stream, 1, SEEK_CURRENT) setzt die file position ein byte weiter, nicht eine Zeile.
Re: Mit GCC eine Zeile aus einer Textdatei löschen
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ßendeswolf4124 hat geschrieben:Die Textdatei hat mehr als die 179 Zeilen.
Code: Alles auswählen
fseek(fp, 1, SEEK_CUR);
MfG GoKi
:wq
:wq
Re: Mit GCC eine Zeile aus einer Textdatei löschen
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
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
Re: Mit GCC eine Zeile aus einer Textdatei löschen
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 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
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
Hier noch ein weiterführender Link:
http://openbook.galileocomputing.de/c_v ... #Xxx999328
MfG GoKi
:wq
:wq