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

Как только вы это сделаете, вы обнаружите, что ваш ввод не выполняется, потому что вы читаете что-то неправильно, но это не должно быть трудно исправить, когда вы увидите, где он сломан.

Другие вопросы по тегам