Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Letzte Zeile einer txt-Datei löschen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.07.2009, 18:07 Uhr
~GastGast
Gast


Hallo,

ist es möglich die letzten 2 Zeilen einer txt-Datei zu löschen ohne eine temporäre Datei zu verwenden? Ich möchte ANSI-C hierfür verwenden.

Problem ist, dass die meisten Befehle, welche ich gesehen habe byte-weise arbeiten. Da ich nicht weiß, wie lange die letzen 2 Zeilen sind, hilft mir das leider nicht.

Ich freue mich über jeden Hinweis.

Viele Grüße
GastGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.07.2009, 18:32 Uhr
0xdeadbeef
Gott
(Operator)


Ich rate dir aus Gründen der Datensicherheit und -integrität dringend davon ab, das ohne temporäre Datei zu machen. Wenn jemand dein Programm im falschen Moment abschießt, kriegst du auf die Art Datenmüll.

Wenn du es aus irgendwelchen Gründen wirklich ohne temporäre Datei machen musst...in ISO-C gibt es meines Wissens keine Möglichkeit, eine Datei direkt zu verkürzen. POSIX stellt dafür ftruncate bereit, Windows hat _chsize oder so. Wenn du dich allerdings auf ISO-C beschränken willst, wirst du den Inhalt der Datei einlesen, die Datei mit "w" neu öffnen (dabei wird sie abgeschnitten) und den Inhalt bis auf die letzten beiden Zeilen wieder hineinschreiben müssen. Andernfalls musst du nur rauskriegen, wo die vorletzte Zeile anfängt (ftell ist dein Freund) und die Position an ftruncate füttern.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.07.2009, 12:28 Uhr
~GastGast
Gast


Hallo,

ich muss nicht wirklich die letzten 2 Zeilen löschen. Ich möchte eigentlich nur die letzte Zeile überschreiben ("</test_case>\n"), die glücklicherweise doch immer einen festen Inhalt haben. Beide zusammen sind 13 Bytes lang.

Deshalb hatte ich mir folgendes Konstrukt gedacht:

Code:
    fp = fopen("test_case.xml", "a");
    if( fp == NULL )
      {
        printf("Cannot open file.\n");
        return;
      }
    
    /* remove the last line </test_case>\n */
    fseek(fp, 0, SEEK_END);
     eof = ftell(fp);
     fseek(fp, eof - 13, SEEK_SET);



Meine Idee ist es einfach den Dateizeiger mit fseek umzupositionieren, wie oben im Code demonstriert. Danach verwende ich fputs um eine Zeile in die Datei einzufügen. Ich hätte erwartet, dass dann meine letzte Zeile überschrieben wird. Leider wird nur an die Datei angehängt. Meine Umpositionierung mit fseek bringt gar keinen Unterschied.

Woran könnte es liegen.
Viele Grüße
GastGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.07.2009, 14:20 Uhr
0xdeadbeef
Gott
(Operator)


Warum nicht stumpf

C++:
fseek(fp, -13, SEEK_END);


? Ansonsten nehme ich an, dass fseek(fp, 0, SEEK_END); das EOF-Bit setzt und dementsprechend nach dem zweiten fseek

C++:
clearerr(fp);


aufgerufen werden müsste.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.07.2009, 15:31 Uhr
~GastGast
Gast


Hallo,

danke für Deine Tipps. Leider funktioniert es noch immer nicht.

Inzwischen habe ich aber etwas herumexperimentiert. Wenn ich eine Datei zum Schreiben ("w") öffne, dann funktioniert das Umpositionieren mit fseek.

Ich möchte aber etwas an eine bestehende Datei anhängen. Deshalb habe ich die Datei mit "a" (append) geöffnet. Wenn ich die Datei mit "a" öffne, dann hat das fseek auf einmal keinerlei Auswirkungen.

Was bleibt mir jetzt noch für eine Lösung?

Viele Grüße
GastGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2009, 18:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


musst "r+" nehmen (bzw mal nachlesen obs nicht "w+" sein muss, hab das nicht genau im kopf welches die datei zerstört und welches nicht )
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.07.2009, 19:08 Uhr
0xdeadbeef
Gott
(Operator)


w verkürzt, r+ wäre dementsprechend richtig. Ich hätte aber gedacht, dass fseek auch mit a funktionieren müsste.

Nachtrag: Tatsache, mit r+ geht's und mit a nicht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.07.2009 um 19:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.07.2009, 11:05 Uhr
~GastGast
Gast


Hallo zusammen,

vielen Dank. r+ funktioniert genau wie ich es möchte. Wenn man mit "a" öffnet, so ist der ursprüngliche Dateiinhalt schreibgeschützt. Deshalb bringt dann auch das Verschieben mit fseek nichts.

Hier ist noch eine Tabelle mit alle Optionen von fopen:
www.win-tux.de/c_018_004.htm#RxxobKap01800404002A1A1F0361B5

Noch eine letzte Frage:

In meiner letzten Zeile steht "</test_case>\n". Das sind 12 Zeichen + das "\n". Ich muss allerdings "eof - 14" verwenden, damit es richtig funktioniert, da ich derzeit gerade leider unter Windows arbeite.

Unter Windows ist das "\n" 2 Bytes lang. Unter Unix allerdings nur 1 Byte lang. Unter Windows müsste ich also "eof - 14" schreiben und unter Unix "eof - 13".

Wie könnte ich portablen Code schreiben, welcher unter beiden OS funktioniert?

Derzeit habe ich es wie in Posting 002 implementiert, allerdings wird die Datei mit "r+" geöffnet.

Viele Grüße
GastGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.07.2009, 13:33 Uhr
Kest
saint


Dafür könnteste Makros nutzen.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.07.2009, 13:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


oder du prüfst einfach dann mit fgetc ob das nächste zeichen auch wirklich ein < ist und wenn nicht gehste noch eins vor
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: