Вам просто нужно изменить порядок ваших утверждений getline, т.е. только один раз для продукта и цены. Кроме того, не используйте eof, чтобы проверить, можно ли читать поток. Оператор getline вместе с извлечением работает как условие завершения для l oop.
. Кроме того, вам не следует проводить сравнения на равенство для значений с плавающей запятой, поэтому вам следует изменить порядок сравнений, чтобы избежать этого.
while (getline(ins, product, '$') >> price) {
if (price > 20.0 ) {
count3++;
}
else if (price > 10.0) {
count2++;
}
else {
count1++;
}
}
Выражение внутри оператора while l oop выглядит странно, но работает следующим образом
getline(ins, product, '$') >> price
getline
возвращает входной поток, который только что был прочитан. Если это не удается, то условие не выполняется. (это то, что вы хотите, потому что не было продукта, заканчивающегося в $ для чтения).
Возвращенный входной поток затем используется для извлечения цены. Если это не удается, тогда условие не выполняется (это также то, что вы хотите, поскольку это означает, что с продуктом не было никакой цены).
Перевод чека на продукт и цены в одно и то же условие легче понять. Это в основном говорит, введите l oop , только если поток только содержит действительный продукт и действительную цену.
Кроме того, это утверждение является избыточным
ins.close(); // close the file
Поток файлов будет автоматически закрыт, когда входящие файлы выйдут из области видимости.