Anne: / C: Letzte 2 Byte einer Datei lesen

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..

  1. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. 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).

      1. 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

        --
        Elefant zum Kamel: "Sag mal, wieso hast du denn den Busen auf dem Rücken?"
        Kamel:             "Ziemlich freche Frage für einen, der den Penis im Gesicht hat."
  2. 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?

    • Handle besorgen
    • Datei sperren
    • Größe der Datei abfragen
    • Dateizeiger an die passende Stelle stellen
    • die Daten lesen und in den Ausgabestream überführen
    • Datei schließen

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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.

  3. 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!

    1. Hallo,

      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..

      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

      --
      "Hier steht, deutsche Wissenschaftler hätten es im Experiment geschafft, die Lichtgeschwindigkeit auf wenige Zentimeter pro Sekunde zu verringern." - "Toll. Steht da auch, wie sie es gemacht haben?" - "Sie haben den Lichtstrahl durch eine Behörde geleitet."
    2. 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

      1. 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

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de