Нужна помощь с текстовыми данными с++

Входной файл сохраняет следующую информацию о студентах:

  • Фамилия
  • Имя
  • Отчество
  • Год рождения
  • Курс

Фамилия, имя и отчество имеют не более 12 символов, пол - указывается символами М и Ж, год рождения - целое из 4 цифр, курс - целое от 1 до 5.

Данные по студентам отделяются знаком «;».

Необходимо написать программу, которая выводит на консоль и в файл следующую информацию:

Суть задания заключается в том , чтобы программа считала и вывела в компилятор , самой популярное женское имя.

Вот что указано в текстовом файле:

keruev,nikita,vasilevich,2003,2,M;kremova,irina,dmitrivna,2001,3,F;morozova,anna,genadevna,2002,F;
gortiv,egor,vasilevich,2002,2,M;morty,irina,igrevna,2003,1,F;gorb,irina,petrova,2000,4,F;
#include<iostream>
#include<string>
#include<fstream>
#include<Windows.h>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Ru");
    char student[256];
    char surname;
    char firstname;
    char middlename;
    char year;
    char course;
    char gender;
    const char* mark = ",";
    ifstream phile("informtion.txt");
    phile.is_open();
    if (!phile.is_open())
    {
        cout << "Произошла ошибка!" << endl;
    }
    while (phile.getline(student, 500, ';'))
    {
        char* names{0};  //имена студенток
        int k = 0;
        if (gender == 'F')//если это студентка
        {
            names[k++] = firstname;
        }
        int count{};
        for (int i = 0; i < k; ++i)
            for (int j = i + 1; j < k; ++j)
                if (names[i] && names[i] == names[j]) {
                    ++count[i];
                }
        int max = 0;
        for (int i = 0; i < k; ++i)
            if (max < count[i])
                max = i;
        cout << "наиболее часто встречается имя: " << names[max];
    }
    phile.close();
}

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

Автор решения: TinyColonel

Про ошибку с инициализацией: Когда вы объявляете локальную переменную, то в ней хранится мусор. И потом вы пытаетесь этот мусор сравнить и присвоить. Нужно просто присвоить этим переменным любое подходящее вам значение.

gender = 'A'
firstname = 'A'
→ Ссылка
Автор решения: Павел Ериков

Честно у вас очень много непонятного в вашем коде, так что приведу пример с комментариями:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

#define MAX_STUDENTS 20

int main()
{
    setlocale(LC_ALL, "Ru");

    ifstream phile("information.txt");

    if (!phile.is_open())
    {
        cout << "Произошла ошибка!" << endl;
        return EXIT_FAILURE;
    }

    //Буффер для считывания информации о студенте
    char student[49];
    //Статический массив, в котором максимум могут хранитьмя 20 имен
    //Да можно использовать всякие динамические структуры, но я решил по простому
    //если они вам нужны можете спокойно добавить.
    char names[MAX_STUDENTS][12];
    //Массив в котором, будет хранится кол-во каждого имени
    //в counts[i] хранится кол-во имен names[i]
    int counts[MAX_STUDENTS]{ 0 };
    //Счетчик, сколько на данный момент уникальных имен
    int count = 0;
    //Максимальный индекс имени в массиве names
    int maxI = 0;
    //Максимальное кол-во появлений имени names[maxI]
    int maxCount = -1;

    //Считываем информацию о студенте по разделителю ';'
    while (phile.getline(student, 49, ';')) {
        //Сразу пропускаем студента мужского пола
        if (student[strlen(student) - 1] == 'M')
            continue;
        //Функция strtok возвращает подстроку строки student разделенную по ,
        //В нашем случае в token будет находится фамилия
        char* token = strtok(student, ",");
        //Передавая NULL мы говорим функции, что работает с той же строчкой student
        //В итоге в token будет уже имя
        token = strtok(NULL, ",");
        int i = 0;
        //Проходимся по всем уникальным женским именам
        //и если находим там имя рассматриваемой на данный момент студентны
        //то увеличиваем кол-во появлений этого имени, сразу проверяем на максимальное кол-во
        //и выходим из цикла
        for (; i < count; ++i)
            if (strcmp(names[i], token) == 0) {
                ++counts[i];
                if (counts[i] > maxCount) {
                    maxCount = counts[i];
                    maxI = i;
                }
                break;
            }

        //Если же мы не нашли совпадений, то 
        //скопируем в names[count] найденное уникальное имя
        //присвоем кол-во появлений 1 и увеличим счетчик уникальных имен
        if (i == count) {
            strcpy(names[count], token);
            counts[count] = 1;
            ++count;

            //Решил сделать проверку
            if (count >= MAX_STUDENTS) {
                cout << "Достигнуто максимальное кол-во имен студентов!" << endl;
                return EXIT_FAILURE;
            }
        }
    }

    //Ну и выводим имя и количество появлений этого имени
    cout << "Наиболее часто встречающее имя: " << names[maxI] << endl;
    cout << "Кол-во таких имен: " << maxCount << endl;

    phile.close();
}

Насчет функций strcmp, strcpy и strtok

Если вам не подходит использования сторонних функций, тогда советую отдельно создать функции и реализовать их, а не нагромождать все в main, с этим я думаю проблем не должно возникнуть.

→ Ссылка