/ C: Letzte 2 Byte einer Datei lesen
Anne
- programmiertechnik
0 MudGuard0 Anne
0 Tom0 Anne
0 Anne0 Der Martin0 Frank Opper0 Tom
Hallo SelfForum.
Mein Tool bekommt ein DATEI.in als Eingabe, soll die letzten zwei Byte auslesen und dann als DATEI.out ablegen. DATEI.out soll DATEI.in ohne die letzen zwei Byte sein. Ich frage mich nun, wie ich das am elegantesten bewerkstellige?
while (read(fd, c, 1) == 1) {
byte_eins = byte_zwei;
byte_zwei = c;
}
So hätte ich zumindest die letzten 2 Byte gelesen. Wie erzeuge ich nun DATEI.out als DATEI.in minus der letzten zwei Byte?
Auf stdio.h möchte ich verzichten..
Hi,
Mein Tool bekommt ein DATEI.in als Eingabe, soll die letzten zwei Byte auslesen und dann als DATEI.out ablegen. DATEI.out soll DATEI.in ohne die letzen zwei Byte sein.
Hm. Das widerspricht sich. Einerseits sollen die zwei letzten Bytes aus DATEI.in als DATEI.out abgelegt werden, andererseits soll DATEI.out die DATEI.in ohne die letzen zwei Byte sein.
Da müßte die Bedingung erfüllt sein, daß DATEI.in 4 Bytes enthält, wobei das 1. und das 3. identisch sein müssen und das 2. und das 4. Byte identisch sein müssen.
Anders kann es (Zitat Sam Hawkins: "wenn ich mich nicht irre") nicht gehen, daß DATEI.out gleichzeitig die DATEI.in ohne deren letzte zwei Bytes ist und aus den letzten beiden Bytes von DATEI.in besteht.
Ich frage mich nun, wie ich das am elegantesten bewerkstellige?
Was denn eigentlich?
cu,
Andreas
Da habe ich mich blöd ausgedrückt. 1. Möchte ich von DATEI.in die letzten zwei Byte lesen 2. Möchte ich DATEI.in nach DATEI.out kopieren, allerdings immer nur bis n-2 Bytes (wobei n Anzahl Bytes von DATEI.in).
Hallo,
Da habe ich mich blöd ausgedrückt. 1. Möchte ich von DATEI.in die letzten zwei Byte lesen 2. Möchte ich DATEI.in nach DATEI.out kopieren, allerdings immer nur bis n-2 Bytes (wobei n Anzahl Bytes von DATEI.in).
aha, jetzt wird's klarer. Dreh die logische Reihenfolge um, dann ergibt es sich von allein:
* Dateigröße fsize von DATEI.in bestimmen
* (fsize-2) Bytes von DATEI.in lesen und gleich wieder in DATEI.out schreiben
* 2 Bytes (den Rest eben) von DATEI.in lesen und merken (oder was auch immer)
So long,
Martin
Hello Anne,
für das Lesen der Datei halte ich hier Streams überhaupt nicht für sinnvoll.
Man möge mich bitte ggf. korrigieren, aber mit dem eröffnen eines Streams auf die Datei bin ich doch gezwungen, die von vorne bis hinten durchzulesen?
Aber was hindert Dich daran, selber einen Stream für die Ausgabe aufzumachen, aber die Datei klassisch zu lesen?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
für das Lesen der Datei halte ich hier Streams überhaupt nicht für sinnvoll.
Ich verstehe jetzt nicht, was meine Alternative wäre.?
Man möge mich bitte ggf. korrigieren, aber mit dem eröffnen eines Streams auf die Datei bin ich doch gezwungen, die von vorne bis hinten durchzulesen?
Es gibt ja noch fseek() (aus stdio.h, daher unerwünscht) oder pread().
Aber was hindert Dich daran, selber einen Stream für die Ausgabe aufzumachen, aber die Datei klassisch zu lesen?
Was meinst du mit "klassisch zu lesen"?
- Dateizeiger an die passende Stelle stellen
Hmm. Ja, evtl. ermittle ich die Größe mit stat(). Wenn ich die Größe der Datei habe, weiß ich, wo ich lesen muss bzw. wie weit ich schreiben möchte..
Danke.
Hier meine Lösung in Schritten:
1. Größe DATEI.in mit stat() ermitteln
2. Letzte zwei Byte mit pread() auslesen, offset ist st_size-2 bzw. st_size-1
3. DATEI.in nach DATEI.out byteweise schreiben, bis st_size-2 Bytes geschrieben worden sind..
Danke euch!
Hallo,
Hier meine Lösung in Schritten:
- Größe DATEI.in mit stat() ermitteln
- Letzte zwei Byte mit pread() auslesen, offset ist st_size-2 bzw. st_size-1
- DATEI.in nach DATEI.out byteweise schreiben, bis st_size-2 Bytes geschrieben worden sind..
warum Schritt 2 und 3 nicht in umgekehrter Reihenfolge, wie ich schon vorgeschlagen hatte?
Ich finde es unlogisch, erst ans Ende zu springen, dort zu lesen, dann wieder an den Anfang zu springen und dort weiterzulesen.
So long,
Martin
Hallo,
Hier meine Lösung in Schritten:
3. DATEI.in nach DATEI.out byteweise schreiben, bis st_size-2 Bytes geschrieben worden sind..
Ich würde aber aus Performance-Gründen auf das byteweise Lesen und Schreiben verzichten und stattdessen einen Puffer in geeigneter Größe nutzen.
Viele Grüße
Frank
Hello,
Ich würde aber aus Performance-Gründen auf das byteweise Lesen und Schreiben verzichten und stattdessen einen Puffer in geeigneter Größe nutzen.
Am besten gleich in Festplattengröße
*scnr*
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg