Datei durchsuchen und an bestimmte stelle schreiben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datei durchsuchen und an bestimmte stelle schreiben

    Hallo!
    Ich lerne gerade PHP und probiere mein erstes "richtiges" Programm zu schreiben.
    Es soll ein kleines Script werden, das News auf meine Homepage setzt.

    Dazu soll eine Datei nach einer bestimmten Stelle durchsucht werden und nach dieser Stelle sollen die News eingefügt werden.

    Ich habe das ganze so versucht:
    PHP-Code:
    <?php
    $filename
    ="test.txt";
    $file=fopen($filename,"r+");
    $marker "Hier";
    $schreiben "Das soll geschreiben werden."
    do { 
          
    $inhalt fgets($file);
    } while(
    $inhalt != $marker);

    fputs($file$schreiben)
    ?>
    Allerdings findet das Script die Stelle, nach der geschrieben werden soll nur, wenn sie eine ganze Zahl ist, z.B. 3 oder 6 oder so.
    Einen String scheint das Script nicht zu finden.
    Außerdem löscht es alles, was nach der Stelle kommt an die geschrieben werden soll.

    Was mach ich falsch? Wie mach ichs besser?

    Danke,
    Moritz
    Zuletzt geändert von mowo(fs); 02.03.2005, 15:34.

  • #2
    versuch's mit einer anderen taktik:
    0. die ganze datei in eine variable auslesen
    1. die nötigen änderungen vornehmen
    2. die datei mit dem neuen inhalt überschreiben

    hint: versuch's mit einer datenbank.

    Kommentar


    • #3
      Danke, werd ich so mal ausprobieren.
      Aber nur mal Interessehalber: Was hab ich denn falsch gemacht?
      Vorallem: Warum funktioniert es nicht, wenn ich nach einem String suche?

      Kommentar


      • #4
        Original geschrieben von mowo(fs)
        Aber nur mal Interessehalber: Was hab ich denn falsch gemacht?
        zunächst mal hast du keine PHP-Tags zur Formatierung deines Postings verwendet. Das macht das Lesen schwer.

        Kommentar


        • #5
          deine menschliche vorstellung davon, wie mann eine textdatei öffnet, stelle sucht und ändert unterscheidet sich stark von der tatsächlichen funktionalität der funktionen, die du verwendest.

          Kommentar


          • #6
            Und? Befreist du mich noch von meiner "Menschlichen Vorstellung"?
            Das PHP_Buch das ich grad wälze hilft mir da leider nicht weiter, sonst wäre ich nicht hier.

            Kommentar


            • #7
              hmm, wie wäre es, wenn du dir selbst hilft? Hier die Hilfe zur Selbsthilfe:

              fopen / fgets / ... / file

              Es ist übrigens nicht so, als dass wir das Thema noch nicht handelt hätten im Forum

              Kommentar


              • #8
                was ist denn unklar? php's verhalten im bezug auf das "schreiben ab X" siehst du ja selbst. einen besseren weg habe ich bereits oben beschrieben.

                Kommentar


                • #9
                  Danke. Nette Seite.

                  Was jetzt noch unklar ist:

                  Wenn ich

                  $marker = "Hier";

                  setze findet er den String Hier nicht, obwohl er in der Datei steht.

                  Setze ich aber

                  $marker = 1; findet er die 1 die in der Datei steht.

                  Wahrscheinlich ist es ja nur so ne dumme Kleinigkeit, aber die suche ich jetzt schon seit 2 Stunden!

                  Kommentar


                  • #10
                    woran machst du fest, dass er die eins findet? wo steht die in der datei. schließlich steht eins in php indirekt auf für true.

                    Kommentar


                    • #11
                      genau, zeig mal den inhalt dieser datei.

                      Kommentar


                      • #12
                        Ich hab das obige Script so abgeändert:

                        PHP-Code:
                        <?php
                        $filename
                        ="test.txt";
                        $file=fopen($filename,"r+");
                        $marker "Hier";
                        $schreiben "Das soll geschreiben werden."
                        do {       
                        $inhalt fgets($file);
                                       echo 
                        $inhalt;          
                        } while(
                        $inhalt != $marker);

                        fputs($file$schreiben)
                        ?>
                        Jetzt schreibt das Script jede Zeile in den Browser, die es aus der Datei ausliest.
                        Findet es den Eintrag auf den Marker gesetzt ist, bricht es ab und es erscheinen nur die Einträge inklusive der Markierung, die vorher stehen.
                        Wie gesagt: Das funktioniert aber nur, wenn ich eine Zahl als Markierung benutze, die 1 war nur ein Beispiel geht auch mit 4 oder 7.
                        Findet es keine Markierung zeigt es einfach die ganze Datei an.

                        Die Datei test.txt sieht bei mir so aus:
                        1
                        2
                        3
                        Hier
                        4
                        5
                        6
                        7
                        8

                        Setze ich also den Marker auf 3 Zeigt es 123 an.
                        Sete ich in aucf 4 zeigt es 123Hier4 an usw.
                        Sete ich den Marker auf Hier zeigt es alles an.

                        Kommentar


                        • #13
                          das problem liegt vermutlich darin, dass dein $inhalt noch das zeilenendezeichen (\n und/oder \r) enthält, dein vergleichsstring "Hier" aber nicht.

                          wenn du als $marker nur einen zahlwert wie 3 verwendest, führt PHP mit der aus der datei gelesenen zeile "3\r\n" wohl erst mal einen typecast durch, macht also die zahl 3 daraus - und der vergleich haut natürlich hin. mit $marker = "3" hätte es vermutlich auch nicht funktioniert.


                          du solltest als zum vergleichen erst mal trim() auf $inhalt anwenden, um whitespace am anfang und ende zu entfernen.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Jepp! Super! Danke! Jetzt gehts!

                            Kommentar


                            • #15
                              Hab zwar nich gelesen, aber wie wärs mit fseek()?
                              Bevor ich nicht in einem angemessenen Alter bin, werde ich keine Witze mehr über schmalle machen!
                              - Zitat Berni

                              Kommentar

                              Lädt...
                              X