Yibo Yang Yibo Yang - 3 months ago 12
C++ Question

File I/O--can't read/write simultaneously?

I'm writing some simple code that's supposed to read every other character, as well as overwriting their adjacent characters with '?'s in a random text file.
eg.
test.txt contains "Hello World";
after running the program, it'd be "H?l?o?W?r?d"

My code below allows me to read every other character from the text file in the console window, but after the program ends and when I open up test.txt, nothing has been changed. Need help to figure out why...

#include<iostream>
#include<fstream>
using namespace std;

int main()
{

fstream data("test.txt", ios::in | ios::out); //here the test.txt can be any random text file
while (!data.eof())
{
if (!data.eof())
{
char ch;
data.get(ch);
cout << "ch is now " << ch << endl;

}


if (!data.eof())
data.put('?');

}
data.close();
return 0;
}

Answer

You forgot to consider that you have 2 streams, istream and ostream.

You need to synchronize the location of these 2 streams to achieve what you want. I modified your code a bit to show what I mean.

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    char ch;
    fstream data("test.txt", ios::in | ios::out); //here the test.txt can be any random text file
    while (data.get(ch))
    {                
      cout << "ch is now " << ch << endl;
      data.seekg(data.tellp());   //set ostream to point to the new location that istream set
      data.put('?');
      data.seekp(data.tellg());   //set istream to point to the new location that ostream set
    }
    data.close();  // not required, as it's part of `fstream::~fstream()`
    return 0;  // not required, as 0 is returned by default
}