Search code examples
c++objectbinaryfilesfileoutputstream

Why I fail to read object from a file?


I want to output string object to the file and get it back, but my code doesn't print nothing at all.

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

void main()
{
    // open file for binary input/output
    fstream binary("data.txt", ios::binary);

    // create random string
    string str1 = "fgh";

    // write down string object to the file
    binary.write(reinterpret_cast<char*>(&str1), sizeof(str1));

    // create second string
    string str2;

    // get str1 to str2
    binary.read(reinterpret_cast<char*>(&str2), sizeof(str1));

    // print second string
    cout << str2;
}

Solution

  • I think the code written below is self explanatory.

    You don't need (and should not use) a binary file to store std::string. Store them in text file separated by a delimiter instead.

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() { // void main doesn't work on C++
    
        // open file for binary input/output
        fstream file("data.txt", ios::in | ios::out); // .txt file is not a binary file dude
    
        // check if file already exists or not
        // file will not be automatically created because ios::in mode is also being used
        if (not file) {
            cerr << "No such file present!" << endl;
            return -1;
        }
    
        // create random string
        string str1 = "fgh";
    
        // write down string object to the file
        // binary.write(reinterpret_cast<char*>(&str1), sizeof(str1));
        file << str1 << endl; // if you are removing std::endl from here then add std::flush
    
        // set get pointer at beginning because write operation has moved it to end
        // it is always better to use two file objects (one ifstream and one ofstream) for such projects.
        file.seekg(ios::beg);
    
        // create second string
        string str2;
    
        // get str1 to str2
        // binary.read(reinterpret_cast<char*>(&str2), sizeof(str1));
        file >> str2;
    
        // print second string
        cout << str2;
    
        return 0;
    }