Swaraj Sonavane
Swaraj Sonavane

Reputation: 5

how exactly input and output file streams work in c++

I came across the following observation while working with input and output file streams and I am confused. Can anyone tell me why this happens:

I saved a txt file on my desktop by the name hello which contains the following text:

Hello my name is xyz

Next, I ran the following code:

    #include <iostream>
    #include <fstream>
    #include <string>

    int main()
    {
    std::fstream strm;
    strm.open("C:\\Users\\SWARAJ SONAVANE\\Desktop\\hello.txt");
    if (strm.fail())
    {
        std::cout << "failed....  :(\n";
    }
    //std::string p;
    //strm >> p;
    //std::cout << p;
    strm << "random text";
    }

The content of the hello.txt file after running this code was:

random textme is xyz

Now i ran the following code on the original hello.txt file

    #include <iostream>
    #include <fstream>
    #include <string>

    int main()
    {
    std::fstream strm;
    strm.open("C:\\Users\\SWARAJ SONAVANE\\Desktop\\hello.txt");
    if (strm.fail())
    {
        std::cout << "failed....  :(\n";
    }
    std::string p;
    strm >> p;
    std::cout << p;
    strm << "random text";
    }

The console printed hello but the contents of the hello.txt file remained unaltered.

Can anybody explain, what difference did reading stream into the string make?

Upvotes: 0

Views: 461

Answers (1)

john
john

Reputation: 87959

If you want to know how streams work in C++ then you need a reference work (and maybe a tutorial as well), obviously its much more complicated than can be explained here.

The reason for what you found is the rule that if you switch from reading to writing (or vice versa) you must execute a positioning or flushing operation before you make the switch. Try the following code instead

int main()
{
    std::fstream strm;
    strm.open("C:\\Users\\SWARAJ SONAVANE\\Desktop\\hello.txt");
    if (strm.fail())
    {
        std::cout << "failed....  :(\n";
    }
    std::string p;
    strm >> p;
    std::cout << p;
    strm.seekp(0);        // position the stream at the beginning
    strm << "random text";
}

Upvotes: 1

Related Questions