C++: чтение txt файла через fstream
У меня есть файл.txt, который выглядит так:
Toy ball
1.25
DVD
20.00
Row Boat
1.00
Первая строка - это элемент, вторая - цена, и она повторяется для следующих 2 элементов и так далее. Итак, мой вопрос: как я могу взять первую строку и поместить ее в строку, а вторую строку и поместить ее в значение с плавающей запятой? Вот код, который у меня есть, я использую структуры.
const int TOTAL_ITEMS = 3;
for (int itemNumber = 0; itemNumber < TOTAL_ITEMS; itemNumber++) {
string line;
getline(inFile,line);
list[itemNumber].item = line;
float cost;
inFile >> cost;
list[itemNumber].price = cost;
}
Затем я печатаю список:
for (int itemNumber = 0; itemNumber < TOTAL_ITEMS; itemNumber++) {
cout << itemNumber << ": " << list[itemNumber].item << " " << list[itemNumber].price << endl;
Теперь это не печатает то, что я хочу, массив struct только взял в первой строке и первой цене и распечатал это, но другие все сказали "0". Любая помощь будет потрясающей. Спасибо, парни
2 ответа
float
вход (кстати, просто используйте double
(меньше проблем) оставляет новую строку во входном буфере, который используется последующим вводом строки.
Вместо этого используйте getline
для обеих строк.
Затем используйте, например, istringstream
преобразовать вторую строку в... double
просто "читая" из него так же, как вы читали бы из inFile
,
В дополнение к этому прямому исправлению ошибки необходимо проверить состояние потока inFile
например, позвонив fail
функция-член. Когда вы используете потоковый объект непосредственно как условие, его преобразование в bool
звонки fail
для вас, и отрицает результат, так что сам объект потока означает "не сбои". Обратите внимание, что good
не является противоположностью fail
, а также обратите внимание, что состояние сбоя является постоянным и приводит к игнорированию последующих операций ввода.
Вам нужно проверять состояние потока по мере использования ввода. Вы можете сделать это, проверив возвращаемое значение getline() и оператора >>:
if (!getline(inFile,line))
; // oops, error, do something
if (!(inFile >> cost))
; likewise
Как только вы это сделаете, вы обнаружите, что ваш ввод не выполняется, потому что вы читаете что-то неправильно, но это не должно быть трудно исправить, когда вы увидите, где он сломан.