Q: I'm trying to update a file in place, by using
fopen
mode"r+"
, reading a certain string, and writing back a modified string, but it's not working.A: Be sure to call
fseek
before you write, both to seek back to the beginning of the string you're trying to overwrite, and because anfseek
orfflush
is always required between reading and writing in the read/write "+" modes.
My question is why fseek
or fflush
is always required between reading and writing in the read/write "+" modes? Section 5.2 of
Andrew Koenig's
C Traps and Pitfalls (1989) mentioned that it is because of a backward compatibility issue. Can anyone explain in detail?
The library buffers input and output operations. Check out setvbuf()
and the _IOFBF
, _IOLBF
parameters to that funktion.
fseek()
or fflush()
require the library to commit buffered operations.
The standard specifies a seek or flush operation as mandatory to allow the library some shortcuts; otherwise, for every I/O operation, the lib would have to check if the previous operation was also a read op (or a write op), and trigger a flush by itself if the "direction" of the I/O changed. With the specifications as-is, the library may assume the client did the seek / flush before changing I/O direction.
Because it keeps OS/library code simpler. A file stream may have separate read and write buffers, and extra effort would be required to make sure they are always synchronised. This would cost performance at times when it wasn't needed.
So instead, the programmer needs to do this explicitly when it is needed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With