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