S
Sachin Garg
I have a program which opens a fstream in binary input+output mode, creating
the file if it doesn't exists. But writing doesn't works after reading, it
must be something obvious that I am not aware of.
f.open(filename,ios::in | ios:
ut | ios::binary | ios::trunc)
The program flow is
1) write some data
2) read the data
3) overwrite old data //this fails
I am aware that mixing reading and writting is complicated due to buffering
and as far as I know the solution is to do a seekg or seekp when changing
between reading and writting, I am doing this between 1, 2 and 3.
In 'my' program, writting in step 3 fails. I wrote a simple program that
does just the above 3 steps with seeks and it works but in my program, it
sets the failbit.
After lots of debugging in internal fstream code I figured that an internal
flag _IOREAD gets set somehow in step 2 which indicates that the stream is
now readonly and causes subsequent writes to fail. It also seems that
_IOREAD is set anytime any read operation is done on a read+write file, is
this correct? And now how do I 'unset' this flag? I tried calling f.clear
and f.seekp but that doesnt helps.
What might be special in my program that causes this read-mode flag to
remain set while this doesn't happens in a barebone/simple test program. I
am not doing anything except f.seekg, f.get, f.read.
Sachin Garg
ps. If it matters, I am using visual studio 9.0
the file if it doesn't exists. But writing doesn't works after reading, it
must be something obvious that I am not aware of.
f.open(filename,ios::in | ios:
The program flow is
1) write some data
2) read the data
3) overwrite old data //this fails
I am aware that mixing reading and writting is complicated due to buffering
and as far as I know the solution is to do a seekg or seekp when changing
between reading and writting, I am doing this between 1, 2 and 3.
In 'my' program, writting in step 3 fails. I wrote a simple program that
does just the above 3 steps with seeks and it works but in my program, it
sets the failbit.
After lots of debugging in internal fstream code I figured that an internal
flag _IOREAD gets set somehow in step 2 which indicates that the stream is
now readonly and causes subsequent writes to fail. It also seems that
_IOREAD is set anytime any read operation is done on a read+write file, is
this correct? And now how do I 'unset' this flag? I tried calling f.clear
and f.seekp but that doesnt helps.
What might be special in my program that causes this read-mode flag to
remain set while this doesn't happens in a barebone/simple test program. I
am not doing anything except f.seekg, f.get, f.read.
Sachin Garg
ps. If it matters, I am using visual studio 9.0