Возникла проблема с чтением цифр в массив через 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();