Bug #81551 [Asn->Fbk]: SplFileObject::fgets( does not advance line pointer after SplFileObject::seek()

From: Date: Thu, 21 Oct 2021 20:37:42 +0000
Subject: Bug #81551 [Asn->Fbk]: SplFileObject::fgets( does not advance line pointer after SplFileObject::seek()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237332@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=81551&edit=1

 ID:                 81551
 Updated by:         requinix@php.net
 Reported by:        lucasfbustamante at gmail dot com
 Summary:            SplFileObject::fgets( does not advance line pointer
                     after SplFileObject::seek()
-Status:             Assigned
+Status:             Feedback
 Type:               Bug
-Package:            Filesystem function related
+Package:            SPL related
 Operating System:   Unix
 PHP Version:        8.0.12
-Assigned To:        cmb
+Assigned To:        
 Block user comment: N
 Private report:     N

 New Comment:

Looks correct to me. Change the lines to get a better picture of what's happening.
https://3v4l.org/33lsI

key() returns the current line number, which should be the same at the "beginning" of the
line (eg, after a seek or rewind) as it is at the "end" of the line (after an fgets). The
line number increments according to iterator semantics, which say that the key/current doesn't
change until a call to next() - or, in this case, if you try to continue reading beyond the current
location using another call to fgets.

Before the bug fix:
- Rewinding returns key=0, fgets=line 0, key=0
- Seeking to 50 would return key=50, fgets=line 51, key=51

After the bug fix:
- Rewinding returns key=0, fgets=line 0, key=0
- Seeking to 50 returns key=50, fgets=line 50, key=50


Previous Comments:
------------------------------------------------------------------------
[2021-10-21 19:34:40] lucasfbustamante at gmail dot com

Description:
------------
While fixing https://bugs.php.net/bug.php?id=62004, PHP 8.0.1
probably introduced a bug, where after using SplFileObject::seek($line), the first
subsequent call to SplFileObject::fgets() does not increase the line pointer.

Test script:
---------------
$file = new \SplTempFileObject();

for ($i = 0; $i < 100; $i++) {
    $file->fwrite("Foo\n");
}

$file->seek(50);

var_dump($file->key());
var_dump($file->fgets());
var_dump($file->key());
var_dump($file->fgets());
var_dump($file->key());

// https://3v4l.org/bX3E0

Expected result:
----------------
I expect that using SplFileObject::fgets() will consistently increment the line pointer
by one.

Actual result:
--------------
The first call to SplFileObject::fgets() after calling
SplFileObject::seek($line) will not increment the lint pointer. Subsequent calls will.


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=81551&edit=1


Thread (11 messages)

« previous php.bugs (#237332) next »