Вот несколько решений для вашей проблемы (часть, читающая входной файл), по крайней мере, если я понял, что вы хотите сделать правильно.Для меня он печатает все автомобили с пробегом <50000 и ценой ниже 9000 из входного файла. </p>
#include <sstream>
// rest of your code...
ifstream IS ("usedcars.txt", ios::in);
string lineTextfile;
while(IS)
{
getline(IS, lineTextfile); // read one line of input file
istringstream parseLine(lineTextfile);
parseLine>>field1>>field2>>field3>>MilesText>>car_costText; // parse individual elements of that line
if(MilesText<50000 && car_costText<9000) //if the miles is less than 50000 and the cost is less than 9000 therefore...
{
cout<<lineTextfile<<endl; //display the record from text file
}
}
IS.close();
Считывание данных из файлового потока и в потоке строк несколькоизбыточно, но это близко к примеру, с которого вы начали.
Если вы хотите использовать struct
, вы можете использовать этот код для перегрузки потоковых операторов, например:
struct Car
{
Car() : year(0), mileage(0), price(0) {};
string manufacturer;
string model;
unsigned int year;
unsigned int mileage;
unsigned int price;
};
istream& operator>>(istream& is, Car& car)
{
is >> car.manufacturer >> car.model >> car.year >> car.mileage >> car.price;
return is;
}
ostream& operator<<(ostream& os, const Car& car)
{
os << car.manufacturer << " " << car.model << " " << car.year << " " << car.mileage << " " << car.price;
return os;
}
bool IsFairPricedCar(const Car& car)
{
return car.price < 9000 && car.mileage < 50000;
}
При таком определении struct
возможно следующее:
ifstream IS ("usedcars.txt", ios::in);
while (IS)
{
Car readCar;
IS >> readCar;
if(readCar.mileage < 50000 && readCar.price < 9000)
{
cout << readCar << endl;
}
}
IS.close();
Альтернатива :
ifstream IS2 ("usedcars.txt", ios::in);
copy_if(istream_iterator<Car>(IS2), istream_iterator<Car>(),
ostream_iterator<Car>(cout, "\n"), IsFairPricedCar);