RFZ: Fehlerhafte Ausgabe

Moin, ich hätt da nen Problem.
Ich lese mit einem Script einen Chat aus, jage jede Zeile durch ein paar Funktionen und gebe es dann wieder aus.
Die Stelle die Fehler macht ist folgende:

while (!feof($fp)) {
        $body.= fgets($fp,2);
  if (strpos($body,"<br>") !== false)
     {
      echo $body."\r\n";
   $body = "";
   flush() ;
     }
  }

Aus dem Orginal vom Chat:
...ein.<br><br>W&aum...

Wird dann plötzlich:
rauf ein.<br><
 br>
W&aum

Ich kann einfach nicht verstehn wieso das so ist, oder wo das Problem liegen könnte.

cu RFZ

  1. while (!feof($fp)) {
      $body.= fgets($fp,2);
      if (strpos($body,"<br>") !== false)
        {
         echo $body."\r\n";
         $body = "";
         flush() ;
        }
    }

    Aus dem Orginal vom Chat:
    ...ein.<br><br>W&aum...

    Wird dann plötzlich:
    rauf ein.<br><
    br>
    W&aum

    Ich kann einfach nicht verstehn wieso das so ist, oder wo das Problem liegen könnte.

    Du liest zwei Bytes aus $fp und hängst sie an $body an. Sobald in $body der Text "<br>" auftaucht, wird $body sowie Wagenrücklauf und Zeilenvorschub ausgeben.
    Die letzten beiden Zeichen, die fgets() bekommt, lauten zufälligerweise "><". Damit wäre das zuvor gelesene "<br" ein komplettes "<br>" und die Ausgabe findet statt, mitten im zweiten "<br>".

    Gruß,
      soenk.e

    1. Du liest zwei Bytes aus $fp und hängst sie an $body an. Sobald in $body der Text "<br>" auftaucht, wird $body sowie Wagenrücklauf und Zeilenvorschub ausgeben.
      Die letzten beiden Zeichen, die fgets() bekommt, lauten zufälligerweise "><". Damit wäre das zuvor gelesene "<br" ein komplettes "<br>" und die Ausgabe findet statt, mitten im zweiten "<br>".

      Danke, du hast vollkommen recht, das hab ich mir auch schon gedacht... Nur was mich so verwirrt hat, auf meinem Windows-PC hat's funktioniert, und ich hab 2 genommen weil bei 1 nix funktioniert hat. Auf dem Linux-Server dann hab ich 1 eingetragen und es geht auch ;) Ich frag mich wo da der Unterschied liegt...

      cu RFZ

      1. Hallo RFZ,

        Danke, du hast vollkommen recht, das hab ich mir auch schon gedacht... Nur was mich so verwirrt hat, auf meinem Windows-PC hat's funktioniert, und ich hab 2 genommen weil bei 1 nix funktioniert hat. Auf dem Linux-Server dann hab ich 1 eingetragen und es geht auch ;) Ich frag mich wo da der Unterschied liegt...

        Unter Windows ist der Zeilentrenner \r\n, Unter Linux \n - d.h. Du musst unter Windows 2 Zeichen einlesen, unter Linux nur eines. Wenn Du das ganze Problem umgehen willst, dann öffne die Datei nicht im Binärmodus (bei fopen das b weglassen) und PHP wandelt alle Zeilenumbrüche transparent in \n um. (sofern die Datei selbst im Betriebsystemeigenen Format liegt) Dann brauchst Du immer nur ein Zeichen auslesen.

        Was ich nicht ganz verstehe: Warum liest Du nicht den kompletten Inhalt der Datei ein ($inhalt = fgets ($fp, filesize($filename));) und ersetzt dann alle '<br>' durch "<br>\r\n"? str_replace ist Dein Freund.

        Viele Grüße,
        Christian

        1. Hallo,

          das zeichenweise Lesen von Dateien ist auch so ziemlich das Teuerste, was man machen kann. Etwas teuer ist nur noch das zeichenweise Schreiben.

          Ob die Hochsprach und das Betriebssystem solch eine Ungeschicklichkeit durch intelligente Block-Buffer wieder wettmachen, ist äußerst fraglich.

          Grüße

          Chris (C)

        2. Was ich nicht ganz verstehe: Warum liest Du nicht den kompletten Inhalt der Datei ein ($inhalt = fgets ($fp, filesize($filename));) und ersetzt dann alle '<br>' durch "<br>\r\n"? str_replace ist Dein Freund.

          Wie ich bereits gesagt habe, lese ich keine Datei, sondern einen Chat aus, mit Sockets. Das kann ich schlecht alles auf einmal lesen :) Auch das mit \r\n stimmt dann nicht mehr, das Format welches vom Chat kommt ist immer das selbe, da dieser auf einem ganz eigenen Server läuft.

          cu RFZ