Hi I am trying to create a collection array of videos from a text file that contains the year and name of the movies,
eg
1994
tron
2015
mad max
1997
pulp fiction
...
I can't seem to work out how to grab more than one word when populating the title.
I have tried to use getline(infile, collection[i].title); in place of the infile>> however that gives me bad output.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
struct data
{
int year;
string title;
}colection[100];
ifstream infile;
infile.open ("videos.txt.");
for(int i = 0; i < 100 && !infile.eof(); i++)
{
infile >> collection[i].year;
infile >> collection[i].title;//works with no white spaces eg "tron"
}
You're mixing formatted and unformatted extraction. When doing so, you often need to get rid of the whitespace left in the stream after a formatted input operation prior to using an unformatted extraction operation.
By the way, looping on eof is a logical error the way you're doing things.
#include <fstream>
#include <iostream>
#include <string>
struct movie
{
int year;
std::string title;
};
// extract a movie from a stream:
std::istream& operator>>(std::istream& is, movie& m)
{
// extract the year:
is >> m.year;
// remove the whitespace between year and title:
is >> std::ws;
// extract the title:
getline(is, m.title);
return is;
}
constunsigned collection_max = 100;
int main()
{
std::ifstream in("video.txt");
movie collection[collection_max];
unsigned n_records = 0;
while (n_records < collection_max && in >> collection[n_records])
++n_records;
std::cout << n_records << " records read:\n";
for (unsigned i = 0; i < n_records; ++i)
std::cout << '\t' << collection[i].year << ' ' << collection[i].title << '\n';
}