par
titerm » 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;
}
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
[php]
/* {{{ 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));
} /* }}} */
[/php]
sachant que
[php]
PHPAPI int _php_stream_eof(php_stream *stream TSRMLS_DC);
#define php_stream_eof(stream) _php_stream_eof((stream) TSRMLS_CC)
[/php]
extrait source de stream.c
[php]
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;
}[/php]