Давайте сделаем это правильно.
Начиная с заголовка, не включайте больше, чем необходимо для определений в этом заголовке, и не импортируйте все идентификаторы из std
в глобальное пространство имен.
#include <string>
struct Kitchen {
double price;
std::string name;
std::string manufacturer;
std::string color;
Kitchen(double price, std::string name,
std::string manufacturer, std::string color)
: price{price}, name{name}, manufacturer{manufacturer}, color{color}
{}
};
Я добавил простой конструктор, так как он понадобится нам для emplace_back
позже.
Теперь реализуем main()
.Для воспроизводимого примера лучше читать из потока строк, чем возиться с файлами:
#include <vector>
#include <sstream>
#include <iostream>
int main()
{
std::vector<Kitchen> kitchens;
std::istringstream file("21000 Landhau Nolte brown\n"
"19000 Modern_fit Hoeffner magnolie\n"
"14700 Pure_Style Wellmann black\n");
{
double price;
std::string name;
std::string manufacturer;
std::string color;
while (file >> price >> name >> manufacturer >> color) {
kitchens.emplace_back(price, name, manufacturer, color);
}
}
std::clog << "Read " << kitchens.size() << " kitchens from input\n";
}
Обратите внимание, что !eof()
не гарантирует, что чтение будет успешным.Вместо этого мы предпринимаем попытку чтения, а затем проверяем, находится ли входной поток в состоянии сбоя.После цикла мы могли бы (если бы захотели) фактически проверить, что мы достигли конца файла, а не какого-либо условия сбоя - я пропустил это для этой простой программы.