fputs - schreibt Daten immer ans Dateiende?!

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

  • #16
    fopen() mit a+ und dann rewind() ist das selbe wie fopen() mit r+.

    Wenn du etwas an eine bestimmte Position in der Datei schreibst, wird alles was danach kommt nicht etwa um die Anzahl der geschriebenen Zeichen weitergeschoben sondern überschrieben. Wenn die Zeile nach dem gesuchten Pattern nur ein \n enthält und du dort hallo\n hinschreibst, werden die nächsten 5 Zeichen nach dem ursprünglichen \n überschrieben.
    Einziger Ausweg: Vor dem Schreiben mußt du den gesamten Rest der Datei zwischenspeichern und dann wieder anhängen.

    Das könnte ungefähr so aussehen (Achtung, ungetestet!):
    PHP-Code:
    $fh fopen($this->LogFilePath'r+');
    if (
    $fh) {
        while (!
    feof($fh)) {
            
    $line fgets($fh);
            
    $pointer ftell($fh);
            if (
    strpos($line'['.$where.']') !== false 
            
    && (feof($fh) || strlen(trim(fgets($fh)) == 0))) {
                
    $rest '';
                while (!
    feof($fh)) $rest .= fgets($fh);
                
    fseek($fh$pointer);
                
    fputs($fh"hallo\n".$rest);
                break;
            }
        }
        
    fclose($fh);

    Bei dieser Problemstellung würde ich allerdings zu file() greifen.
    Etwa so (wiederum ungetestet!):
    PHP-Code:
    $lines file($this->LogFilePath);
    foreach (
    $lines as $num => $line) {
        if (
    trim($line) == '['.$where.']' 
        
    && strlen(trim($lines[$num+1])) == 0) {
            
    $lines array_slice($lines0$num
                            + array(
    $num+=> "hallo\n")
                            + 
    array_slice($lines$num+1);
            
    file_put_contents($this->LogFilePathimplode(''$lines));
            break;
        }

    Zuletzt geändert von onemorenerd; 09.08.2007, 19:52.

    Kommentar


    • #17
      weisst, das komische is ja, dass nix ueberschrieben wurde , sondern das Hallo gleich ans Ende gehängt wurde (unverständlicherweise).

      Rein theoretisch hätte mein "Hallo" ja [calls] überschreiben müssen?

      ..schaue mir deine prozedur trotzdem mal an. thx

      Kommentar


      • #18
        Nein das ist nicht komisch.

        fseek($fp,$zeiger);
        $zeiger = ftell($fp);

        Fällt dir gar nicht auf, dass du $zeiger schon benutzt, bevor du ihm einen Wert zuweist?

        Kommentar


        • #19
          wenn ichs weg mach ( so wars bevor ich geposted hab) klappts auch nicht, najo ich machs wohl so dass ich alles in ein string packe und den string bearbeite, und schließlich wieder in die text datei einfüge, ist aber nicht perfomant ode r?
          Zuletzt geändert von sypr0; 09.08.2007, 20:04.

          Kommentar


          • #20
            Juhu so klappts, mit deiner Hilfe
            Dateizeiger suxx ^^

            PHP-Code:
            $lines file($this->LogFilePath);
            foreach (
            $lines as $num => $line)
            {
              if (
            strstr($line,$pattern)) 
             {
                   if ((
            $lines[$num+1]) == "\n")
                   {
                     
            $lines[$num+1]="hallo\n";
                     
            file_put_contents($this->LogFilePath,$lines);    
                   }
            ... 

            Kommentar


            • #21
              Original geschrieben von sypr0
              wenn ichs weg mach ( so wars bevor ich geposted hab) klappts auch nicht, ..
              ohne worte
              Die Milch bleibt ranzig!

              Kommentar

              Lädt...
              X