kac26
kac26

Reputation: 391

Read class objects from file c++

I need to read class objects from file, but I don't know how.

Here I have a class "People"

class People{
public:

string name;
string surname;
int years;
private:

People(string a, string b, int c):
name(a),surname(b),years(c){}
};

Now I would like to read peoples from .txt file and store them to objects of a class People.

For instance, this is how my .txt file looks like:

John Snow 32
Arya Stark 19
Hodor Hodor 55
Ned Stark 00

I think the best way to do this would be to create array of 4 objects. I need to read word by word and line after line, if I assume correctly but I don't know how...

Upvotes: 2

Views: 19307

Answers (1)

Curious
Curious

Reputation: 21510

The way to do this would be to compose a storage format for your class, for instance if I were to do this I would store the information just like you did

John Snow 32
Arya Stark 19
Hodor Hodor 55
Ned Stark 00

To read this in you could do the following

ifstream fin;
fin.open("input.txt");
if (!fin) {
    cerr << "Error in opening the file" << endl;
    return 1; // if this is main
}

vector<People> people;
People temp;
while (fin >> temp.name >> temp.surname >> temp.years) {
    people.push_back(temp);
}

// now print the information you read in
for (const auto& person : people) {
    cout << person.name << ' ' << person.surname << ' ' << person.years << endl;
}

To write it to a file you could do the following

static const char* const FILENAME_PEOPLE = "people.txt";
ofstream fout;
fout.open(FILENAME_PEOPLE); // be sure that the argument is a c string
if (!fout) {
    cerr << "Error in opening the output file" << endl;

    // again only if this is main, chain return codes or throw an exception otherwise
    return 1; 
}

// form the vector of people here ...
// ..
// ..

for (const auto& person : people) {
    fout << people.name << ' ' << people.surname << ' ' << people.years << '\n';
}

If you are not familiar with what a vector is vectors are the recommended way to store an array of objects that can grow dynamically in C++. The vector class is a part of the C++ standard library. And since you are reading in from a file you should not make any assumptions about how many objects are going to be stored in the file ahead of time.

But just in case you are not familiar with the classes and features I used in the example above. Here are some links

vector http://en.cppreference.com/w/cpp/container/vector

ifstream http://en.cppreference.com/w/cpp/io/basic_ifstream

range based for loop http://en.cppreference.com/w/cpp/language/range-for

auto http://en.cppreference.com/w/cpp/language/auto

Upvotes: 4

Related Questions