Doc #76995 [Com]: fseek() breaks reading in read/append (a+) mode

[email protected] ("sincerelyjulie0 at gmail dot com") Sun, 10 Dec 2023 04:21:24 +0000
Newsgroups php.doc.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=76995&edit=1

 ID:                 76995
 Comment by:         sincerelyjulie0 at gmail dot com
 Reported by:        miloslav dot hula at gmail dot com
 Summary:            fseek() breaks reading in read/append (a+) mode
 Status:             Open
 Type:               Documentation Problem
 Package:            Streams related
 PHP Version:        7.3.0RC2
 Block user comment: N
 Private report:     N

 New Comment:

position the file pointer for reading.


Previous Comments:
------------------------------------------------------------------------
[2023-05-13 12:02:14] cynthiamarshal0010 at gmail dot com

To address the doc bug where fseek() breaks reading in read/append (a+) mode, it's important to understand the behavior of fseek() in that mode and how to correctly position the file pointer for reading. Here's an explanation and solution to update the documentation:

Explanation:
In the a+ mode, when you use fseek() with a positive offset, it is expected to move the file pointer to that offset from the beginning of the file. However, in certain implementations, fseek() may not work as expected in a+ mode and instead positions the file pointer relative to the current end of the file. This behavior can lead to unexpected results when trying to read from the file.

Solution:
To correctly position the file pointer for reading in a+ mode, you should use fseek() with a negative offset relative to the end of the file. Here's an example of how to update the documentation to reflect this:

vbnet

When using `fseek()` in read/append (`a+`) mode, it's important to note that its behavior may vary depending on the implementation. In some cases, `fseek()` may not correctly position the file pointer for reading. To ensure proper positioning, follow the recommended approach below:

To move the file pointer to a specific position from the end of the file, use a negative offset with `fseek()`. For example, to move the file pointer to the last 100 bytes of the file:

   fseek(file, -100, SEEK_END);

This ensures that the file pointer is correctly positioned for subsequent read operations.

Please note that this workaround may not be necessary in all implementations of the C standard library. It's recommended to test and verify the behavior of `fseek()` in your specific environment to ensure compatibility and consistent results.

By providing this updated information, users will be informed about the potential issue with fseek() in a+ mode and the recommended approach to correctly position the file pointer for reading. (https://dgmeportal.live/)github.com

------------------------------------------------------------------------
[2018-10-10 16:08:23] [email protected]

And seconds after I hit Submit, I realize that documenting append mode's fseek quirks would be a good idea.

------------------------------------------------------------------------
[2018-10-10 16:07:12] [email protected]

Unfortunately this really is one of those "undefined behavior" situations, and PHP isn't the one responsible for it.

Look at the fopen(3) docs on Linux: https://linux.die.net/man/3/fopen
> Reads and writes may be intermixed on read/write streams in any order. Note
> that ANSI C requires that a file positioning function intervene between output
> and input, unless an input operation encounters end-of-file. (If this condition
> is not met, then a read is allowed to return the result of writes other than
> the most recent.) Therefore it is good practice (and indeed sometimes necessary
> under Linux) to put an fseek(3) or fgetpos(3) operation between write and read
> operations on such a stream. This operation may be an apparent no-op (as in
> fseek(..., 0L, SEEK_CUR) called for its synchronizing side effect.

------------------------------------------------------------------------
[2018-10-10 15:11:26] miloslav dot hula at gmail dot com

Or: "In this mode, fseek() only affects the reading position". Sound like positive claim.

------------------------------------------------------------------------
[2018-10-10 15:07:02] miloslav dot hula at gmail dot com

At least, documentation is misleading. "a+ mode is for reading/append". How can one read from file, when cannot seek?

Could be clearer with: "only appended data can be read, seeking not supported"

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


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=76995


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