Добавление целых из входного файла - PullRequest
2 голосов
/ 22 марта 2020

У меня есть код, который выглядит так

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

struct Bill{
    std::string name;
    int bill_value;
};

enum Status{abnorm, norm};

bool read(std::ifstream &f, Bill &e, Status &st);


int main()
{
    std::ifstream x("inp.txt");
    if (x.fail() ) {
        std::cout << "Error!\n";
        return 1;
    }

    Bill dx;
    Status sx;
    int s = 0;
    while(read(x,dx,sx)) {
        s += dx.bill_value;
    }

    std::cout << "Today income: " << s << std::endl;
    return 0;
}

bool read(std::ifstream &f, Bill &e, Status &st){
    std::string line;
    getline(f,line);
    if (!f.fail() && line!="") {
        st = norm;
        std::istringstream in(line);
        in >> e.name;

        std::string product;
        int value;
        e.bill_value= 0;
        while( in >> product >> value) e.bill_value+= value;
    }
    else st=abnorm;

    return norm==st;
}

Входной файл называется inp.txt и выглядит так:

Joe tv 1200 mouse 50000
Peter glass 8000
Harry mouse 8200 usb 8000 headphones 98900
David book 500 800 mouspad 900
Liam phone 8000 cooler 3000 headphones 3000
Daniel laptop 700 pot 9000

Первым всегда является имя клиента , который следует за продуктом (ами), который он купил, и его стоимостью.

Например, Петр купил стакан за 8000, но Дэвид купил две книги по двум разным ценам.

И вот тут-то и возникает моя проблема, потому что по линии Дэвида программа возвращает только значение первой книги, а не сумму строки, и я хотел бы узнать, какую прибыль магазин получил мне нужно было бы также рассчитать сумму счета Дэвида.

1 Ответ

2 голосов
/ 22 марта 2020

Пусть file будет

std::ifstream file;

Теперь должно работать следующее, результат содержится в accu:

int accu = 0;
for (std::string line; std::getline(file,line);)
{
    // replace non-spaces and non-digits by nothing
    // thus only spaces and digits are left
    std::string numbers = std::regex_replace(line, std::regex(R"([^\\d])"), "");

    std::stringstream ss(numbers);
    for (int price; ss >> price;)
    {
        accu += price;
    }
}

Сначала мы читаем файл построчно -линия. Для каждой строки мы убираем нечисловые c символы, а не пробелы, так как они нужны нам для разделения чисел. Используя std::stringstream, мы извлекаем данные числа. Кроме того, я использовал

#include <sstream>
#include <string>
#include <regex>

Версия c++11 должна быть достаточной.

Примечание: всякий раз, когда имена или слова содержат другие цифры или цифры, результат явно неверен. Можно исправить регулярное выражение, чтобы исключить цифры из других слов, чтобы исправить это частично. В противном случае требуется больше информации о файловой структуре.

...