Boost logo

Boost Users :

From: Sachin Garg (schngrg_at_[hidden])
Date: 2008-08-22 09:09:00


I have a program which opens a boost 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. filename is a wpath.

  f.open(filename,ios::in | ios::out | 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. Problem might not be
boost specific as boost only uses stl fstream but any help will be
really useful.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net