fork download
  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <list>
  6.  
  7. // структура с описанием полей в строке
  8. struct data {
  9. std::string first_name, last_name;
  10. std::size_t week1, week2;
  11. double pay_rate;
  12. };
  13.  
  14. // контейнер(список)
  15. using container = std::list<data>;
  16.  
  17. // функция загрузки данных
  18. container load_data(std::istream& input);
  19.  
  20. int main() {
  21. //std::ifstream fin("timesheet.txt");
  22. auto& fin = std::cin;
  23.  
  24. container table;
  25. try {
  26. // пробуем загрузить список из файла
  27. table = load_data(fin);
  28. }
  29. catch(std::runtime_error& e) {
  30. // не получилось загрузить, печатаем ошибку и выходим
  31. std::cerr << e.what() << std::endl;
  32. return 0xdead;
  33. }
  34. // получилось загрузить
  35. // проходимся по списку и выводим данные
  36. for(const data& d : table) {
  37. std::cout << d.first_name << ' ' << d.last_name
  38. << std::endl
  39. << d.week1 << " - " << d.week2
  40. << std::endl
  41. << d.pay_rate
  42. << std::endl
  43. << std::endl;
  44. }
  45. return 0;
  46. }
  47.  
  48. namespace tools {
  49. // вспомогательная функция
  50. // удаляет пробельные символы с правого конца строки
  51. std::string right_trim(const std::string &str) noexcept {
  52. std::string::size_type last_space = str.find_last_not_of(" \t\r\n");
  53. return last_space == std::string::npos ? "" : (
  54. str.size() == (last_space + 1) ? str : str.substr(0, last_space + 1)
  55. );
  56. }
  57. }
  58. // функция загрузки данных
  59. container load_data(std::istream& input) {
  60. container result; // список с результатом
  61. std::string line; // входная строка
  62.  
  63. // читаем по строкам, пока на входе есть данные
  64. while (std::getline(input, line)) {
  65. line = tools::right_trim(line);
  66. // пропускаем пустые строки
  67. if (!line.empty()) {
  68. std::istringstream parser(line);
  69. data tmp;
  70. char sign;
  71.  
  72. // пытаемся разобрать строку на части
  73. parser >> tmp.first_name
  74. >> tmp.last_name
  75. >> tmp.week1
  76. >> tmp.week2
  77. >> sign // пропускаем знак долора
  78. >> tmp.pay_rate;
  79. // если неудалось разобрать
  80. if (parser.fail()) {
  81. // то грнерируем ошибку
  82. throw std::runtime_error("parser.fail(): " + line);
  83. }
  84. // если в строке небыло знака '$'
  85. if (sign != '$') {
  86. // то грнерируем ошибку
  87. throw std::runtime_error("sign != '$': " + line);
  88. }
  89. // удалось считать все данные - добавляем в список
  90. result.push_back(tmp);
  91. }
  92. }
  93. return result;
  94. }
  95.  
Success #stdin #stdout 0s 3480KB
stdin
John Adams 30 55 $10
Lyndon Johnson 45 25 $8.50

Richard Nixon 30 30 $15.20
stdout
John Adams
30 - 55
10

Lyndon Johnson
45 - 25
8.5

Richard Nixon
30 - 30
15.2