I wish to open a file using the "a+b" mode, i.e. if it does not exist it is created automatically, but if it does I don't want to overwrite it. I want to be able to read and write to the file.
The file is binary, and I want to save records of a specific struct
in it. So I want to do fseek()
to the record I want and then save the record using fwrite()
.
The code looks as follows (MyRecord
is a typedef
to a struct
, while FILENAME
is a #define
to the file's name):
int saveRecord(MyRecord *pRecord, int pos)
{
FILE* file = fopen(FILENAME, "a+b");
if (file == NULL)
{
printf("Unable to open file %s\n", FILENAME);
return 0;
}
fseek(file, pos * sizeof(MyRecord), SEEK_SET);
fwrite(pRecord, sizeof(MyRecord), 1, file);
fclose(file);
return 1;
}
However this code just appends the record to the end of the file, even if I set pos
to 0. Why isn't fseek()
with SEEK_SET
working in append mode?
I know I can simply open it with "r+b" and if it fails open it with "wb", but I want to know why this doesn't work and why fseek()
with SEEK_SET
is leaving the file pointer at the end. Any references to places where this behaviour is documented appreciated (because I couldn't find any, or I am using the wrong keywords).
fseek() is used to move file pointer associated with a given file to a specific position. position defines the point with respect to which the file pointer needs to be moved.
The fseek() function seeks in an open file. This function moves the file pointer from its current position to a new position, forward or backward, specified by the number of bytes. Tip: You can find the current position by using ftell()!
fseek () function moves file pointer position to given location. SEEK_SET moves file pointer position to the beginning of the file.
As we discussed, the seek() method sets the file's current position, and then we can read or write to the file from that position. How many points the pointer will move is computed from adding offset to a reference point; the reference point is given by the whence argument.
That's because in a
mode, writing to the FILE*
always appends to the end. fseek
only sets the read pointer in this mode. This is documented in the C standard, 7.19.5.3 fopen:
Opening a file with append mode (
'a'
as the first character in the mode argument) causes all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to thefseek
function.
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