Почему выводит непонятные символы в консоли?

Есть 2 схожих кода. Отличие только в том, что в первом случае - это Список, а во втором Хештаблица. В хештаблице 1 аргумент- это число int, второй - это класс student. В списке это только класс student. Вот код:

Класс Student:

#pragma once
#include <iostream>
using namespace std;

class student
{
private:
    string name;
    int age;
    string parol;
    string clas;
    string dateBirth;
public:
    student(string name_m, int age_m, string class_m,string dateBirth);
    ~student() {};
    friend ostream& operator<< (std::ostream& out, const student& strudent_m);
};


#include "Student.h"


student::student (string name_m, int age_m, string class_m, string dateBirth_m)
{
    this->name = name_m;
    this->age = age_m;
    this->clas = class_m;
    this->dateBirth = dateBirth_m;

}
ostream& operator<< (std::ostream& out, const student& strudent_m)
{
    out <<  strudent_m.name << endl;
    out <<  strudent_m.dateBirth << endl;
    out <<  strudent_m.age << endl;
    out <<  strudent_m.clas<< endl;
    return out;
}

Само создание списка и хештаблицы и инициализация:


int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    ifstream in("test.txt");
    map <int, student> map1;//Хэштаблица
    while (!in.eof())
    {
        string name_m;
        getline(in, name_m);
        int hashParol_m;
        in >> hashParol_m;
        in.ignore(20, '\n');
        int age_m;
        in >> age_m;
        in.ignore(20, '\n');
        string clas_m;
        getline(in, clas_m);
        string birthday_m;
        getline(in, birthday_m);
        student a1(name_m, age_m, clas_m, birthday_m);
        map1.emplace(hashParol_m, a1);
    }
    student a2("Никита Хува", 15, "7Б","15.03.2001");
    map1.emplace(213, a2);

    map<int, student>  ::iterator  it = map1.begin();
    for (it = map1.begin(); it != map1.end(); it++)
    {
        cout << (it->first) << endl;
        cout << it->second << endl;
    }
    ifstream ina("StudentRegistrationList.txt");
    list <student> list1;//Список
    while (!ina.eof())
    {
        string name_m;
        getline(ina, name_m);
        int age_m;
        ina >> age_m;
        ina.ignore(20, '\n');
        string clas_m;
        getline(ina, clas_m);
        string birthday_m;
        getline(ina, birthday_m);
        student a1(name_m, age_m, clas_m, birthday_m);
        list1.push_back(a1);
    }
    list <student> ::iterator  its = list1.begin();
    for (its = list1.begin(); its != list1.end(); its++)
    {
        cout << (*its);
    }
    
}

Вот 2 файла, которые я читаю:

Документ для считывания list

Документ для считывания map

При отладке в консоль выводит вот эту вод белеберду, как видите я добавил еще 1 элемент в хештаблицу и он вывелся без проблем. А те, которые были прочитаны с файла почему то не хочет понимать русский текст, хотя использовал в начале :

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Как можно обойти или что нужно сделать? Не совсем понимаю в чем ошибка. А да, пробовал отлаживать код поэтапно, он сразу в переменную name_m записывает вот эту белеберду


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

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

Потому что файл в UTF8, а ты его читаешь и выводишь как 1251.

Проще будет пересохранить файл в 1251.

→ Ссылка