Считывание и вывод определённой информации из файла
Мне нужно вывести информацию про баскетболистов, которые заработали больше 150 очков (это значение после предпоследней точки с запятой в каждой строчке) При этом условии вывести надо будет первую и последнюю строчку
Ibrahimovic;Ivan;Petrovich;male;Swede;83;195;27,11,1923;8800;Manchester United;7;forward;1150;378
так как 1150 > 150
Zhitkov;Valery;Evgenich;male;Ukrainian;83;195;30,27,1983;7700;dynamo;9;defender;190;78
190 > 150
Вот скрин всего файла
Я реализовал только построчное считывание, разделение по ";" и вывод всего. Помогите пожалуйста сделать так, чтобы выводились только те баскетболисты , которые набрали больше 150 очков и может быть знаете как улучшить код для разделения строки по ";"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
string s;
ifstream file("C:\\Stuff\\info.txt");
while (getline(file, s)) {
cout << s << endl;
string delimiter = ";";
size_t pos = 0;
string token;
while ((pos = s.find(delimiter)) != string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
cout << s << endl;
}
file.close();
return 0;
}
Ответы (2 шт):
Для этой задачи было бы неплохо объявить класс, например, Player, хранящий информацию о игроке.
class Player
{
public:
// парсит целую строку и инициализирует поля
Player(const string &input);
// далее методы получения полей (остальные опущены для упрощения)
string get_name() const;
size_t get_scores() const;
};
Список игроков удобно было бы представить вектором:
vector<Player> players;
Тогда чтение данных из файла выглядело бы примерно так:
while (getline(file, s)) {
players.emplace_back(s);
}
Теперь можно организовать поиск примерно так:
for (const auto &player: players) {
if (player.get_scores() > 150) {
// делаем то, что нужно с игроками, у кого очков больше чем 150
}
}
Вот пример кода с комментариями и без ООП:
string s;
ifstream file("D:\\info.txt");
string token;
while (getline(file, s)) {
int index = 0;
int start = s.size() - 1;
int finish;
//Найдем в строке начало и конец очков
for (; start >= 0; --start) {
if (s[start] == ';')
++index;
if (index == 1)
finish = start;
if (index == 2)
break;
}
//Обрежем строчку для удобства (хотя можно и от этого избавится)
token = s.substr(++start, s.size());
//И просто сравним
if (atoi(s.c_str() + finish) > 150)
cout << s << endl;
}
file.close();