Frage: SChleife dauert zu lange

Code:
<?php
$file = fopen("bilder.list","r");
$i = 0;
while(!feof($puffer))
{
$puffer = fgets($file, 200);
$gex = explode("|",$puffer);
echo('<a href="');
echo($gex[$i]);
echo('">Bild ');
echo(" $i<br>");
$i++;
}


?>

Der Code klappt nicht, die Seite läd immer weiter.


Warum?

EDIT nach einer zeit kommt:Warning: feof(): supplied argument is not a valid stream resource in /home/www/freehosting/32305/htdocs/protect/bilder.php on line 4
Bild 0
 
$puffer = fgets($file, 200);
wird jedes mal neu in der schleife initialisiert, mit dem selben wert

zu deinem edit:
$puffer ist beim 1. aufruf noch NULL
 
vor der schleife das initialisieren oder eine abfrage die das nur beim 1. durchlauf macht.

programmieren = logisches kobinieren, konzentrier dich, dann passiert das nicht
 
bitte gerne, melde dich ruhig wieder wenn du ein problem mit dem alorythmus hast.

konzentiert durchgehen und evtl. aufzeichnen so findet man solche fehler ;)
 
$puffer = fgets($file, 200);
wird jedes mal neu in der schleife initialisiert, mit dem selben wert

Warum sollte das passieren? Der Interne Zeiger wird jedes mal um eins erhöht, somit bekommst Du immer eine Zeile aus der Datei.
Es liegt daran, dass feof() ein gültiges Dateihandle braucht und keine Variable!!

Also so:

PHP:
$file = fopen("./test.txt","r");

while(!feof($file)) // $file hat evtl. ein gültiges Dateihandle
{
        //$puffer hat nur den Wert 
	$puffer = fgets($file, 4096);
	echo $puffer,"<br/>";
}

man könnte es aber auch so machen:

PHP:
<?php

if($file = @fopen("./test.txt","r"))
{
	while($puffer = fgets($file, 4096))
	{
		echo $puffer,"<br/>";
	}
}
else
{
	echo "Die Datei konnte nicht geöffnet werden!";
}
?>
 
$file ist ein pointer auf eine geöffnete datei, und bei funktionen die mit hilfe dieser pointer daten lesen (hier fgets) wird dieser pointer vorwärts geschoben, so das beim nächsten aufruf der funktion ab dieser stelle weiter gelesen wird.
wenni ch mich recht erinnere liest fgets so wie es hier aufgerufen wird, die aktuelle zeile bis zum 200. Zeichen, oder wenn vorher ein EOL kommt bis zu diesen.
Stell dir vor das File ist ein Buch, und $File ist dein Finger, wenn fgets die sagt: "Gibt mir die nächste Zeile, aber nur bis zu 200 Zeichen" dann liest du dem fgets die Zeile bis zum 200. Zeichen vor, und wartest da mit deinem Finger bis dir wieder was gesagt wird.
In diesem Script wird dir immer wieder von fgets das selbe gesagt, und das bis du auf der letzten seite des buches bist. das sieht die Whileabrage dann an deinem Finger, und sagt dir du sollst das Buch zumachen ;-)

Grüße phx1024

P.S.: nit falsch verstehen wenn ich das so erkläre, ich verwende nur sehr gern analogien ;-)
 
Für mich gilt
1 Char = 1 Byte
kann sein das das bei Java mit unicode anders ist,
und das es bei PHP vieleicht auch Unicode-kram gibt,
aber ich progge in C und C++ und da stimmt das,
wenn ich nen Zeilenumbruch aus MS-Text hab, ist das enter nu mal
2 Zeichen groß.

grüße phx1024
 
Zurück
Oben