AIR2: fputs hängt parameter an, aber überschreibt ihn nicht

Hallo.

per fopen öffne ich eine txt-Datei
mit fgets lese ich den inhalt (EINE Zahl) in eine Variable
mit $VARIABLE++ erhöhe ich die Zahl um 1
mit fputs schreibe ich die um 1 erhöhte Variable in die txt-Datei
und schließlich schliesse ich mit fclose die Datei wieder

und nun sehe ich, daß fputs die Variable anhängt, aber nicht überschreibt.

Am Anfang ist 0 in der Datei
Dann ist 01 in der Datei
Dann 012 in der D.
dann 01213 in d. D.
dann 012131214 in der Datei

also wollte ich vor dem fputs befehl die Datei leeren per ftruncate($Datei,'0'); . Doch dann war da plötzlich ein Leerzeichen, aber die 0 war weg, was ich ja wollte ;-)

Meine Frage: Kann man nur den Inhalt einer Datei löschen aber die Datei selber nicht?
Und warum hängt fputs den übergebenen Parameter AN, aber überschreibt ihn nicht?

  1. hi,

    Und warum hängt fputs den übergebenen Parameter AN, aber überschreibt ihn nicht?

    vermutlich, weil du die datei in einem ungeeigneten modus geöffnet hast.
    aber welchen du benutzt hast, hast du uns ja leider nicht verraten ...

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. aber welchen du benutzt hast, hast du uns ja leider nicht verraten ...

      Sorry... Nachtrag:

      $db_file_w="db/count/Datei.txt";
      $db_opened_w=fopen($db_file_w,"r+b");
      $number=(integer)fgets($db_opened_w,4);
      $number++;

      fputs($db_opened_w,$number);
        fclose($db_opened_w);

      Wie gesagt, der inhalt der datei ist ursprünglich 0 .

  2. Moin!

    per fopen öffne ich eine txt-Datei

    Meine Frage: Kann man nur den Inhalt einer Datei löschen aber die Datei selber nicht?

    schaue ma bei der function fopen() nach. da steht was über den parameter 'mode' in der Funktion.

    tschüssi
    ichen

    1. Moin!

      schaue ma bei der function fopen() nach.

      Weißt du wie oft ich da schon war in der zeit in der das Forum offline war? Nicht bös gemeint, nur: Ich kenne den Text inzwischen auswendig...
      Ich habe den parameter r+ gewählt mit einem b hinten dran, weil ich windows benutze

      1. Moin AIR2

        Ich habe den parameter r+ gewählt mit einem b hinten dran, weil ich windows benutze

        parameter r öffnet lesend
        parameter + hängt an
        B = Binäry und hat nichts mit Windoof zu tun

        Öffne deine datei mit r und lese, dann schließen und wieder mit w schreiben. Ansonsten must du den Dateizeiger auf den Anfang setzten, dann klappts auch mit dem überschreiben.

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. Moin AIR2

          Hallo auch!

          B = Binäry und hat nichts mit Windoof zu tun

          Wirklich nicht?
          Ausschnitt aus der fopen-definition auch www.php.net:

          "
          Zusätzlich kann mode der Buchstabe 'b' hinzugefügt werden, der die Behandlung von Binärdateien erlaubt. Dies ist nur auf Systemen sinnvoll, welche zwischen Binär- und Text-Dateien unterscheiden (z.B. Windows. Ist bei Unix sinnlos).
          "

          Öffne deine datei mit r und lese, dann schließen und wieder mit w schreiben. Ansonsten must du den Dateizeiger auf den Anfang setzten, dann klappts auch mit dem überschreiben.

          Danke. ich versuchs mal so!

          1. Moin AIR2

            Wirklich nicht?
            Zusätzlich kann mode der Buchstabe 'b' hinzugefügt werden, der die Behandlung von Binärdateien erlaubt. Dies ist nur auf Systemen sinnvoll, welche zwischen Binär- und Text-Dateien unterscheiden (z.B. Windows. Ist bei Unix sinnlos).

            Siehste! Du möchtest eine Textdatei schreiben und keine Binärdatei. So wie du es erwähnt hast würde es bedeuten das Windoof immer ein b verlangt. Dies ist allerdings nur bei Binär nötig.

            regds
            Mike©

            --
            Freunde kommen und gehen. Feinde sammeln sich an.
        2. Öffne deine datei mit r und lese, dann schließen und wieder mit w schreiben. Ansonsten must du den Dateizeiger auf den Anfang setzten, dann klappts auch mit dem überschreiben.

          Ich glaubs nicht!!!! Es funktioniert *MEGAFREU* !!!!!! Vielen Vielen Dank, mike!!!!

        3. Hello,

          Ich habe den parameter r+ gewählt mit einem b hinten dran, weil ich windows benutze

          parameter r öffnet lesend
          parameter + hängt an
          B = Binäry und hat nichts mit Windoof zu tun

          Öffne deine datei mit r und lese, dann schließen und wieder mit w schreiben. Ansonsten must du den Dateizeiger auf den Anfang setzten, dann klappts auch mit dem überschreiben.

          die Modi:

          r       nur zum Lesen, nicht zerstörende Öffnung
          w       nur zum Schreiben, ZERSTÖRENDE Öffnung
          a       nur (zum Erzeugen) und Anhängen, eigentllich ursprünglich nur für Textdateien,
                  nicht zerstörend, nach Behebung eines Bugs ist es nicht mehr möglich, in die bereits
                  vor der Öffnung vorhandenen Daten hineizuschreiben.
          x       neuer Modus (zum Anlegen) + Schreiben, nicht zerstörend

          r+      auch zum Schreiben, nicht zerstörende Öffnung, Zum Schreiben wahlfreier Zugriff
                  auf den gesamten Bereich der Datei
          w+      auch zum Lesen der gerade geschriebenen Daten
          a+      auch zum Lesen aller verfügbarer Daten der Datei
          x+      auch zum Lesen aller verfügbaren Daten in der Datei

          b       bedeutet "binäre Öffnung" und sollte besser IMMER benutzt werden, da anderenfalls
                  bei Windows eine unerwünschte Interpretation der Textdaten als _Zeilendatenn_
                  durchgeführt wird und die Zeilenendezeichen auf Windows-Standard umgewandelt werden
                  Das führ auf jeden Fall zu fehlern, wenn man z.B.Bilder speichert, in deren Stream die
                  Zeichen  (10) und (13) dezimal ASCII  ja auch einzeln vorkommen können.

          fputs() ist eigentlich ursprünglich auch nur für Textdateien und zeilenweises Schreiben gewesen.

          Wenn immer hinten angehängt wird, kann das auch als Ursache haben, dass der Dateizeiger noch vom Lesevorgang hinter der Datei steht. Der muss dann voerher eben erst wieder passend positioniert werden. Der Modus (rb+) oder (r+b), das sollte beides funktionieren, ist geeignet, eine Datei zu öffnen un djedes beliebige Byte der Datei auszutauschen. Schau Dir auch fseek() an.

          Außerdem solltest Du die englische Version http://de.php.net/manual/en/function.fopen.php bevorzugen. In deutschen fehlt noch ein großer Teil an Beschreibungen.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau