Использование std :: ifstream для чтения цен товаров из файла - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь решить это задание:

Напишите программу для чтения файла с именем Prices.txt, который содержит произвольное количество строк названий продуктов и цен, разделенных долларом. ($). После прочтения продуктов ваша программа должна проанализировать все из них и распечатать статистику о ценах - сколько цен продуктов находится в диапазонах - (0, 10], (10, 20] и выше 20. Текстовый файл может содержать:

Кока-кола $ 1,45
Красное вино $ 20,3
Виски $ 100
Вода $ 1,2

Пример вывода программы для вышеуказанного ввода, как показано ниже:

0-10: 2 товар (ов)
10-20: 0 товар (ов)
выше 20: 2 товар (ов)

Этот код пока как я вошел в это:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int main() {
    ifstream ins;  // declare an input file stream object
    ins.open("prices.txt");  // open the file
    if (ins.fail()) {     // check if there was an error
        cout << "Error opening file";
        return -1;
    }

    int count1 = 0; //variable to count how many prices are from 0 - 10
    int count2 = 0; //variable to count how many prices are from 10 - 20
    int count3 = 0; //variable to count how many prices are above 20

    string product;
    float price = 0;

    getline(ins, product, '$');
    while (!ins.eof()) {
        ins >> product >> price;
        if (price > 0 && price <= 10.0) {
            count1++;
        }
        else if (price > 10.0 && price <= 20.0) {
            count2++;
        }
        else {
            count3++;
        }
        ins.ignore(100, '\n');  // ignore the next newline
        getline(ins, product, '$');  // read the product name until the $ sign
    }

    ins.close();  // close the file
    cout << "0-10: " << count1 << " product(s) " << endl;
    cout << "10-20: " << count2 << " product(s) " << endl;
    cout << "above 20: " << count3 << " product(s) " << endl;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

@ cigien @ user4581301 Спасибо, ребята, за ваши отзывы, я действительно ценю это, но я вроде как исправил это сам, так как читал продукт до знака $ с getline(ins, product, '$'); до того, как l oop и курсор был уже по цене, но с ins >> product >> price; через некоторое время я указывал цену продукта на продукт, так как я читал продукт два раза. Просто удалив товар на ins >> product >> price, сделав его ins >> price, все исправили.

0 голосов
/ 24 марта 2020

Вам просто нужно изменить порядок ваших утверждений 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

Поток файлов будет автоматически закрыт, когда входящие файлы выйдут из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...