[SPL]SplFileObject->eof()

Mammouth du PHP | 684 Messages

04 avr. 2006, 15:36

Salut.

Je suis sur des tests unitaires de la classe SplFileObject.
Je m'amuse donc (si on peut appeller cela jouer) avec cette classe et je suis sur les tests de la methode eof(). Voici un tout petit bout de code qui me pose probleme :

Code : Tout sélectionner

//Dans mon fichier tmpfile.txt, il y a cette chaine (attention au \n et j'ai aussi essaye avec \0 a la fin) : abcdefgh\npqrstuvwxyz\n
<?php
$fi1 = new SplFileObject('tmptest/tmpfile.txt');
var_dump($fi1->eof()); //affiche false, je suis d'accord.
$fi1->fseek(21);
echo 'ftell = '.$fi1->ftell().'<br />'; //affiche 21
var_dump($fi1->eof()); //affiche false, je suis d'accord.
echo 'ftell = '.$fi1->ftell().'<br />'; //affiche 21
$fi1->fseek(22);

var_dump($fi1->eof()); //affiche false, je NE suis PAS d'accord.

echo 'ftell = '.$fi1->ftell().'<br />'; //affiche 22
Quelqu'un a une petite idee ??? Dans la documentation de la SPL, il est ecrit ceci : SplFileObject::eof() -> return eof($this->fp);
Je ne trouve nulle part la fonction eof dans PHP.

Merci d'avance pour vos aides.
Zigz4g

Mammouth du PHP | 505 Messages

05 avr. 2006, 13:15

Attention, tes \n sont 2 caractères s'ils sont écrient tels quels dans un fichier, c'est l'interpreteur php qui transforme un "\n" en newline. En aucun cas la lecture d'un fichier ne transformera un \n en newline.

Donc dans ton raisonnement, il faudrai faire un fseek(24) pour etre après le dernier caractère.

Ceci étant dit, le eof() est set apres une lecture, pas après un fseek. Tu pourrait faire un fseek(50000) cela ne changerai rien si tu ne lit pas au moins un caractère. Idem pour le valid().

Le fait qu'il utilise eof() en lieu et place de feof() est vraisemblablement une erreur de transcription C => php.
extrait Source spl_directory.c
/* {{{ proto void SplFileObject::eof()
   Return whether end of file is reached */
SPL_METHOD(SplFileObject, eof)
{
	spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);

	RETURN_BOOL(php_stream_eof(intern->u.file.stream));
} /* }}} */
sachant que
PHPAPI int _php_stream_eof(php_stream *stream TSRMLS_DC);
#define php_stream_eof(stream)	_php_stream_eof((stream) TSRMLS_CC)
extrait source de stream.c
PHPAPI int _php_stream_eof(php_stream *stream TSRMLS_DC)
{
	/* if there is data in the buffer, it's not EOF */
	if (stream->writepos - stream->readpos > 0) {
		return 0;
	}

	/* use the configured timeout when checking eof */
	if (!stream->eof && PHP_STREAM_OPTION_RETURN_ERR ==
		   	php_stream_set_option(stream, PHP_STREAM_OPTION_CHECK_LIVENESS,
		   	0, NULL)) {
		stream->eof = 1;
	}

	return stream->eof;
}