Markus: Daten an den Anfang einer Datei schreiben

Hallo!

Ich habe folgendes Problem:

open (FILE, ">>$variable");

Durch diesen Befehl wird die Datei, die sich hinter $variable verbirgt, zum Lesen und Schreiben geöffnet. Beim Schreiben wird der bisherige Dateiinhalt beibehalten und neuer Inhalt an das Ende der Datei angehängt. Nun will ich aber, dass der neueste Inhalt immer an den Anfang der Datei geschrieben wird.

Wie kann ich das machen?

Hoffe Ihr könnt mir helfen!

Markus

  1. Moin!

    open (FILE, ">>$variable");

    Durch diesen Befehl wird die Datei, die sich hinter $variable verbirgt, zum Lesen und Schreiben geöffnet. Beim Schreiben wird der bisherige Dateiinhalt beibehalten und neuer Inhalt an das Ende der Datei angehängt. Nun will ich aber, dass der neueste Inhalt immer an den Anfang der Datei geschrieben wird.

    Wie kann ich das machen?

    Neue, temporäre Datei öffnen, den Anfang schreiben, dann die alte Datei öffnen, auslesen und hinter den Anfang in die neue Datei schreiben. Alle Dateien schließen, die alte Datei löschen und die temporäre Datei umbenennen.

    Wahlweise die alte Datei komplett in den Speicher einlesen (Array), dort entsprechend bearbeiten (etwas vorn anfügen) und dann wieder auf Platte schreiben.

    - Sven Rautenberg

    1. Hallo Sven!

      Danke für Deine Hilfe, ich habe es mit der zweiten Variante gelöst (Inhalt in eine Variable laden und später wieder anfügen).

      Nun gibt es aber noch ein Problem:
      Ab der dritten Zeile in der Datei wird immer ein Leerzeichen angefügt. Also in der vierten Zeile schon zwei. Beispiel:
      Text text Text
      Text text Text
       Text text Text
        Text text Text
         Text text Text

      ^So sieht das dann später aus.

      Woran liegt das?

      Hier der Code:

      open (DATA, "$data");
      @inhalt = <DATA>;
      close (DATA);

      open (FILE, ">$data");
      print FILE "$var1&&$var2&&$var3&&$var4\n";
      print FILE "@inhalt";
      close(FILE);

      Danke,
      Markus

      1. Hallo,

        open (DATA, "$data");
        @inhalt = <DATA>;
        close (DATA);

        open (FILE, ">$data");
        print FILE "$var1&&$var2&&$var3&&$var4\n";
        print FILE "@inhalt";
        close(FILE);

        Abgesehen davon, daß
        print FILE @inhalt;
        (siehe dazu perldoc perlfaq4 Frage What's wrong with always quoting ``$vars''?)

        völlig ausreichend ist, sehe ich da keinen Fehler. Ist das sicher der Original-Code und drehst Du auch sicher nicht an irgendwelchen vordefinierten Variablen wie  $/,$\ und vor allem $,?

        Grüße
          Klaus

        1. Guten Abend

          open (DATA, "$data");
          @inhalt = <DATA>;
          close (DATA);

          open (FILE, ">$data");
          print FILE "$var1&&$var2&&$var3&&$var4\n";
          print FILE "@inhalt";
          close(FILE);

          Abgesehen davon, daß
          print FILE @inhalt;
          (siehe dazu perldoc perlfaq4 Frage What's wrong with always quoting ``$vars''?)

          völlig ausreichend ist, sehe ich da keinen Fehler. Ist das sicher der Original-Code und drehst Du auch sicher nicht an irgendwelchen vordefinierten Variablen wie  $/,$\ und vor allem $,?

          Nein! Ich weiß auch einfach nicht woran das liegt. Könnte man das Problem vielleicht mit chop; oder chomp; lösen? Damit komme ich noch nicht ganz klar.

          Grüße,
          Markus

          1. Hallo,

            Nein! Ich weiß auch einfach nicht woran das liegt.

            Da ich keine Kristallkugel besitze, weiß ich es auch nicht. Stell doch einfahc einmal den Quellcode als Text-Datei irgendwo online, damit wir ihn uns ansehen können. Die Datendatei wäre auch nicht schlecht.

            Könnte man das Problem vielleicht mit chop; oder chomp; lösen? Damit komme ich noch nicht ganz klar.

            'Das galub' ich nicht, Tim'. chop() entfernt das letzte Zeichen eines Strings, chomp() das letzte Zeichen, wenn es der sog. INPUT_RECORD_SEPARATOR (standardmäßig \n) ist. Du aber hast ein Problem am Anfang der Zeile.

            Grüße
              Klaus

            1. Moin!
              Also so wie ich als echter PERL-Kenner das sehe, liegt das Problem eher bei den Daten, zumindest wenn Du genau obigen Code benutzt. Man bedenke, das einfache Leerzeichen in html nicht angezeigt werden, aber bei so ner Aktion schon, falls diese in den Daten stehen. Für mich sieht das so aus, als würde entweder in (einer) der ersten variable(n) ein Leezeichen stehen, alleine oder am Anfang eines Stings, oder Du machst irgendeinen Fehler beim auslesen der Daten, was bei der Regelmäßigkeit vieleicht sogar wahrscheinlicher ist. Aber das sind jetzt meine Vermutungen, lösen kann man das nur mit dem kpl. Code und den Daten, wie bereits gesagt wurde!
              Grüß
              Andreas

  2. Hallo,

    open (FILE, ">>$variable");
    Durch diesen Befehl wird die Datei, die sich hinter $variable verbirgt, zum Lesen und Schreiben geöffnet.

    Nein, sie wird im sog. Append-Mode geöffnet. Lesen ist dabei nicht möglich. (http://www.perldoc.com/perl5.6.1/pod/func/open.html)

    Beim Schreiben wird der bisherige Dateiinhalt beibehalten und neuer Inhalt an das Ende der Datei angehängt. Nun will ich aber, dass der neueste Inhalt immer an den Anfang der Datei geschrieben wird.

    Wie kann ich das machen?

    Dateiinhalt in eine Variable (Array eventuell) einlesen, diese dann in der gewünschten Form manipulieren, und dann wieder komplett rausschreiben.

    Solltest Du immer nur zu Beginn der DAtei einfügen wollen, dann kannst Du auch Dein Programm dahingehend ändern, daß es zwar immer ans Ende der Datei schreibt, allerdings beim EInlesen die Reihenfolge umdreht, damit die Letzten Einträge am Anfang stehen.

    Welche der Varianten sinnvoller ist, hängt davon ab, wie oft geesen bzw. geschrieben werden muß.

    Grüße
      Klaus