Bug #78850 [Nab]: PHP Version 7.2.3 - fseek

From: Date: Thu, 21 Nov 2019 17:31:10 +0000
Subject: Bug #78850 [Nab]: PHP Version 7.2.3 - fseek
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-223834@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78850&edit=1

 ID:                 78850
 Updated by:         requinix@php.net
 Reported by:        david dot wildermoth at yandex dot com
 Summary:            PHP Version 7.2.3 - fseek
 Status:             Not a bug
 Type:               Bug
 Package:            Filesystem function related
 Operating System:   Widows 10
 PHP Version:        7.2.24
 Block user comment: N
 Private report:     N

 New Comment:

You cannot *insert* into the file. You can *overwrite*.

Open up your favorite text editor. Pull open any file you like and put the cursor somewhere in the
middle. Then turn on your editor's overwrite/overtype mode (probably Ins key) and start typing.
That's what fseek-ing into the middle and fwrite-ing will do, except it will overwrite newlines
as well.


Previous Comments:
------------------------------------------------------------------------
[2019-11-21 10:16:55] david dot wildermoth at yandex dot com

"There is no way to insert at the beginning or in the middle of a file." That statement
appears to be incorrect.

https://www.php.net/manual/en/function.fseek.php

Sets the file position indicator for the file referenced by handle. The new position, measured in
bytes from the beginning of the file, is obtained by adding offset to the position specified by
whence.

The coding that I submitted does insert in the middle of the file. The "bug" I'm
reporting inserts white space in addition to the output which is what I want to delete.

------------------------------------------------------------------------
[2019-11-21 09:54:58] requinix@php.net

If you are not appending to the end of the file then you are overwriting. That's how files
work. There is no way to insert at the beginning or in the middle of a file.

If you want to prepend your records then
a) load the entire file into memory, prepend, and write it all back out, or
b) write the new record to a temporary file, append the old file into it, and rename the new file
onto the old one

------------------------------------------------------------------------
[2019-11-21 09:51:10] david dot wildermoth at yandex dot com

Description:
------------
---
https://www.php.net/manual/en/function.fseek.php
---

This "fseek" coding has a malfunction:-

$record = fopen("C:xampp/htdocs/application/views/record.php", "r+");
fseek($record, 200); //fseek malfunctions
$gm = gmdate("\nd M Y H:i T");
fwrite($record, $gm);
$ad = (" - $advertiser") . "<br>";
fwrite($record, $ad);

That producers a result similar to the following:-

21 Nov 2019 - 14:38 GMT - chris<br>

Which is 35 bytes or thereabouts. That is OK for the first record, but if there exists a previous
record, then that previous record will be overwritten which is what I don't want.

If I advance (by white space) a previous record by about 35-40 bytes the new record will print plus
consume an additional 35 odd bytes, and that previous record moves 35 bytes closer to the new
record. I want to avoid that extra consumption.

I want the output to consume only the bytes of its length, no more.

If I insert "a" which takes the pointer to the end, everything works but the output is
"recent at the bottom" whereas I want "recent at the top" hence using
"r+" and "fseek".

I have read the PHP manual on fseek() and fwrite() and others but there is nothing suggesting a
consumption limitation, or similar. I've also tried various addins but nothing has worked.


Expected result:
----------------
I want the output to consume only the bytes of its length, no more.



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



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


Thread (8 messages)

« previous php.bugs (#223834) next »