PHP Code endet in Endlosschleife



  • [cs]Hi!

    Ich versuche mich gerade an PHP (Anfaenger).
    Folgender Code endet in einer Endlosschleife, weil $length immer 0 ist:
    Der Code ist BTW komplett von mir, also nicht aus dem Web zusammengekleistert.

    function printAll()
    	{
    		$handle = fopen("DATA/TEXT.txt", "cb");//open file, get pointer
    
    		if($handle === FALSE)
    			echo 'Error opening file!'."\n";
    
    		while( !feof( $handle ) )// ?
    		{
    			echo fread( $handle, 15 ).' ';// Print the date
    
    			$length = 0;
    			fscanf($handle, "%d", $length);//get Length of the text
    			echo " L ".$length;
    
    			$str = fread($handle, $length + 1);//read text + newline
    
    			echo $str."\n ";
    		}
    
    		fclose( $handle);
    	}
    

    Die zu lesende Datei ist Leer! Eigentlich duerfte die Schleife also gar nicht starten. Tut sie aber (siehe Zeile 14, da ist ein "Checkpoint" zum testen).

    Wieso startet die Schleife also?

    MfG

    Edit: Ausserdem wird die '\n' Escapesequenz ignoriert (beim Ausgeben). Wieso? Soll ich stattdessen einfach <br /> verwenden?


  • Mod

    Man testet eigentlich nie auf EOF direkt sondern macht das immer ueber die leseoperationen.

    und length aenderst du nie, es ist also immer 0.



  • Shade Of Mine schrieb:

    Man testet eigentlich nie auf EOF direkt sondern macht das immer ueber die leseoperationen.

    und length aenderst du nie, es ist also immer 0.

    Ich komme zwar aus C++, doch ich dachte, $length wird auf den Wert des eingelesenen %d gesetzt (wie bei Cs scanf)?



  • Shade Of Mine schrieb:

    Man testet eigentlich nie auf EOF direkt sondern macht das immer ueber die leseoperationen.

    Alles klar, danke schonmal 🙂



  • Alles klar, danke Shade! Das funktioniert schonmal;
    Nun folgendes:

    Die Funktion sieht jetzt so aus:

    function printAll()
    	{
    		$handle = fopen("DATA/TEXT.txt", "rb");//open file pointer
    
    		if($handle === FALSE)
    		{
    			echo 'Error opening file!'."\n";
    			return;
    		}
    
    		for(;;)
    		{
    			$date = fread( $handle, 15 );
    
    			$length = fscanf($handle, "%d");//get Length of the text
    
    			$text = fread($handle, $length + 1);//read text + newline
    
    			if( $date   !== FALSE
    			&&  $length !== FALSE
    			&&  $text   !== FALSE )
    				echo $date."<br />".
    				     $text."<br />";// Print the date
    			else
    				return;
    		}
    
    		fclose( $handle);
    	}
    

    Ein Fehler war mitunter der Oeffnungsmodus (c), der eigentlich r sein sollte.\

    Danke fuer deine Hilfe!



  • du returnst ohne das handle zu closen.
    use break..



  • breakme schrieb:

    du returnst ohne das handle zu closen.
    use break..

    Stimmt, danke! 😃


Anmelden zum Antworten