Возникла проблема с чтением цифр в массив через fstream на C++

Нужно реализовать чтение цифр из файла и последующую запись в массив. Вот код:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{

   //фаза объявления
   setlocale(LC_ALL, "rus");
   string imena[] = { "Камиль омаров -", "Иван Рыжов -", "Ярослав Протасов -", "Драйго Корвиус -", "Виктор Романов -", "Дмитрий Воронов -", "Иван Стрелецкий -", "Данил Халимов -", "Рустам Габбасов -", "Михаил Тимофеев -" };
   int plus[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
   string vvod[10] = { "0 - ", "1 - ", "2 - ", "3 - ", "4 - ", "5 - ", "6 - ", "7 - ", "8 - ", "9 - ", };
   int pvvod = 0;
   int x = 0;
   char vopros[] = "Нажмите '1', если хотите выдать ему плюс.";
   char menu[] = "Нажмите '2' для возвращения в меню.";
   char vid[] = "Нажми '1' и мы выдаем ему плюс(мы - боги)";
   //фаза считывания 
   

   //фаза показа

Menu:
   cout << vvod[0] << imena[0] << plus[0] << endl;
   cout << vvod[1] << imena[1] << plus[1] << endl;
   cout << vvod[2] << imena[2] << plus[2] << endl;
   cout << vvod[3] << imena[3] << plus[3] << endl;
   cout << vvod[4] << imena[4] << plus[4] << endl;
   cout << vvod[5] << imena[5] << plus[5] << endl;
   cout << vvod[6] << imena[6] << plus[6] << endl;
   cout << vvod[7] << imena[7] << plus[7] << endl;
   cout << vvod[8] << imena[8] << plus[8] << endl;
   cout << vvod[9] << imena[9] << plus[9] << endl;

   //Фаза получения ввода

   cin >> x;

   // Фаза считывания/выдачи инфы

   ifstream fin;
   fin.open("Gym.txt");
   fin.close();

   // Фаза расчета
   cout << vopros << endl;
   cout << menu << endl;
   cin >> pvvod;
   if (pvvod == 1)
   {
       cout << imena[x] << plus[x] << endl;
       if (pvvod == 1)
       {
           plus[x]++;
           cout << "Мы дали ему плюс...Иди, путник. \n";
           cout << "\n";
           ofstream fout("Gym.txt");
           fout << imena[0] << plus[0] << endl;
           fout << imena[1] << plus[1] << endl;
           fout << imena[2] << plus[2] << endl;
           fout << imena[3] << plus[3] << endl;
           fout << imena[4] << plus[4] << endl;
           fout << imena[5] << plus[5] << endl;
           fout << imena[6] << plus[6] << endl;
           fout << imena[7] << plus[7] << endl;
           fout << imena[8] << plus[8] << endl;
           fout << imena[9] << plus[9] << endl;
           fout.close();
           goto Menu;
       }
   }
   else
   {
       goto Menu;
   }
   

}


Вот пример данных в файле:

Камиль омаров -1
Иван Рыжов -1
Ярослав Протасов -1
Драйго Корвиус -0
Виктор Романов -0
Дмитрий Воронов -0
Иван Стрелецкий -0
Данил Халимов -0
Рустам Габбасов -0
Михаил Тимофеев -0

Ответы (1 шт):

Автор решения: Павел Ериков

Вот пример кода с комментариями:

ifstream fin;
fin.open("Gym.txt");

string t;
int count = 0;
int i = 0, number = 0;
//Считываем строку до первого '\n' то есть строку
while (getline(fin, t, '\n')) {
    i = t.size() - 1;
    //Начиная с конца строки идем до символа, который стоит перед числом и 
    //не является частью этого числа
    while (i >= 0 && t[i] >= '0' && t[i] <= '9') --i;
    //Записываем первую цифру
    number = t[++i] - '0';
    ++i;
    //А далее обычный парсер из строки в число
    while (i < t.size() && t[i] >= '0' && t[i] <= '9') {
        number = number * 10 + (t[i] - '0');
        ++i;
    }
    //Записываем в массив plus полученное число
    plus[count++] = number;
}

fin.close();

Вот способ намного проще (почему то я сразу не додумался):

ifstream fin;
fin.open("Gym.txt");

string t;
int count = 0;
int i = 0;
//Считываем строку до первого '\n' то есть строку
while (getline(fin, t, '\n')) {
    i = t.size() - 1;
    //Начиная с конца строки идем до символа, который стоит перед числом и 
    //не является частью этого числа
    while (i >= 0 && t[i] >= '0' && t[i] <= '9') --i;
    //Используем функцию atoi, чтобы спарсить строку в число
    plus[count++] = atoi(t.c_str() + i + 1);
}

fin.close();
→ Ссылка