#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
// структура с описанием полей в строке
struct data {
std::string first_name, last_name;
std::size_t week1, week2;
double pay_rate;
};
// контейнер(список)
using container = std::list<data>;
// функция загрузки данных
container load_data(std::istream& input);
int main() {
//std::ifstream fin("timesheet.txt");
auto& fin = std::cin;
container table;
try {
// пробуем загрузить список из файла
table = load_data(fin);
}
catch(std::runtime_error& e) {
// не получилось загрузить, печатаем ошибку и выходим
std::cerr << e.what() << std::endl;
return 0xdead;
}
// получилось загрузить
// проходимся по списку и выводим данные
for(const data& d : table) {
std::cout << d.first_name << ' ' << d.last_name
<< std::endl
<< d.week1 << " - " << d.week2
<< std::endl
<< d.pay_rate
<< std::endl
<< std::endl;
}
return 0;
}
namespace tools {
// вспомогательная функция
// удаляет пробельные символы с правого конца строки
std::string right_trim(const std::string &str) noexcept {
std::string::size_type last_space = str.find_last_not_of(" \t\r\n");
return last_space == std::string::npos ? "" : (
str.size() == (last_space + 1) ? str : str.substr(0, last_space + 1)
);
}
}
// функция загрузки данных
container load_data(std::istream& input) {
container result; // список с результатом
std::string line; // входная строка
// читаем по строкам, пока на входе есть данные
while (std::getline(input, line)) {
line = tools::right_trim(line);
// пропускаем пустые строки
if (!line.empty()) {
std::istringstream parser(line);
data tmp;
char sign;
// пытаемся разобрать строку на части
parser >> tmp.first_name
>> tmp.last_name
>> tmp.week1
>> tmp.week2
>> sign // пропускаем знак долора
>> tmp.pay_rate;
// если неудалось разобрать
if (parser.fail()) {
// то грнерируем ошибку
throw std::runtime_error("parser.fail(): " + line);
}
// если в строке небыло знака '$'
if (sign != '$') {
// то грнерируем ошибку
throw std::runtime_error("sign != '$': " + line);
}
// удалось считать все данные - добавляем в список
result.push_back(tmp);
}
}
return result;
}