0

Пишу простенькую программу для статистической (количественной) оценки текста. Во время выполнения вместо исходного текста на русском языке из файла цепляет (В похожие вопросы попались методы смены языка консоли, однако мой вопрос не касается ВЫВОДА, проблема именно что VS19 видит текст следующим образом, а сравнивает с обычными русскими буквами) "Р¬ Р˜Р™Р—РџР®РљРљР® СВНЙЗЬШЖВЧ Р˜Р—Р›Р—Р”РЁ РЃР—РђР–Р— Р˜Р™Р’РЃР®Р–Р§Р›РЈ ЛЗЕУДЗ ЗЩЙШЛВЁЫЮ Р—Р˜Р®Р™РЁРџР’Р’, Р’Р–РЁР Р® Р–РЁ Р˜Р™Р’Р®РЃР–Р—Р“ КЛЗЙЗЖЮ Р˜Р—Р•РњР РЁР›Р®Р•.." вместо исходного "Ь ИЙЗПЮККЮ СВНЙЗЬШЖВЧ ИЗЛЗДШ ЁЗАЖЗ ИЙВЁЮЖЧЛУ ЛЗЕУДЗ ЗЩЙШЛВЁЫЮ ЗИЮЙШПВВ, ВЖШРЮ ЖШ ИЙВЮЁЖЗГ КЛЗЙЗЖЮ ИЗЕМРШЛЮЕУ ЖЮ КЁЗАЮЛ ЗЭЖЗБЖШРЖЗ ЬЗККЛШЖЗЬВЛУ ВКОЗЭЖЫГ ЛЮДКЛ ИЗ ИЙВЖЧЛЗЁМ КЗЗЩТЮЖВЦ, ЭШАЮ БЖШЧ ИЙШЬВЕУЖЫГ ДЕЦР." (исходный текст зашифрован поэтому так выглядит). Насколько я понял проблема в кодировке, однако как ее решить не совсем понимаю. Так же я не доволен общим видом кода, поэтому приветствуются варианты его сократить и улучшить читаемость.

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;

int main() { setlocale(LC_ALL, "Russian"); int a = 0; int b = 0; int v = 0; int g = 0; int d = 0; int e = 0; int ee = 0; int j = 0; int z = 0; int i = 0; int k = 0; int l = 0; int m = 0; int n = 0; int o = 0; int p = 0; int r = 0; int s = 0; int t = 0; int f = 0; int h = 0; int c = 0; int ch = 0; int y = 0; int cha = 0; int znak = 0; int ii = 0; int ie = 0; int u = 0; int ia = 0;

string intext;
int totalNums = 1;
ifstream file_in;
file_in.open(&quot;W:\\posled.txt&quot;);
if (!file_in)
{
    std::cout &lt;&lt; &quot;Проблемы с открытием файла&quot;;
}
else
{
    std::cout &lt;&lt; &quot;Файл открыт!\n&quot;;
}
while (!file_in.eof()) // основной цикл
{
    //string  stroka;
    getline(file_in, intext);


for (int sch = 0; sch &lt; intext.size(); sch++)
{
    if (intext[sch] == 'А')
    {
        a++;
        totalNums++;
    }
    if (intext[sch] == 'Б')
    {
        b++;
        totalNums++;
    }
    if (intext[sch] == 'В')
    {
        v++;
        totalNums++;
    }
    if (intext[sch] == 'Г')
    {
        g++;
        totalNums++;
    }
    if (intext[sch] == 'Д')
    {
        d++;
        totalNums++;
    }
    if (intext[sch] == 'Е')
    {
        e++;
        totalNums++;
    }
    if (intext[sch] == 'Ё')
    {
        ee++;
        totalNums++;
    }
    if (intext[sch] == 'Ж')
    {
        j++;
        totalNums++;
    }
    if (intext[sch] == 'З')
    {
        z++;
        totalNums++;
    }
    if (intext[sch] == 'И')
    {
        i++;
        totalNums++;
    }
    if (intext[sch] == 'Й')
    {
        ii++;
        totalNums++;
    }
    if (intext[sch] == 'К')
    {
        i++;
        totalNums++;
    }
    if (intext[sch] == 'Л')
    {
        l++;
        totalNums++;
    }
    if (intext[sch] == 'М')
    {
        m++;
        totalNums++;
    }
    if (intext[sch] == 'Н')
    {
        n++;
        totalNums++;
    }
    if (intext[sch] == 'О')
    {
        o++;
        totalNums++;
    }
    if (intext[sch] == 'П')
    {
        p++;
        totalNums++;
    }
    if (intext[sch] == 'Р')
    {
        r++;
        totalNums++;
    }
    if (intext[sch] == 'С')
    {
        s++;
        totalNums++;
    }
    if (intext[sch] == 'Т')
    {
        t++;
        totalNums++;
    }
    if (intext[sch] == 'У')
    {
        y++;
        totalNums++;
    }
    if (intext[sch] == 'Ф')
    {
        f++;
        totalNums++;
    }
    if (intext[sch] == 'Х')
    {
        h++;
        totalNums++;
    }
    if (intext[sch] == 'Ч')
    {
        ch++;
        totalNums++;
    }
    if (intext[sch] == 'Ц')
    {
        c++;
        totalNums++;
    }
    if (intext[sch] == 'Щ')
    {
        cha++;
        totalNums++;
    }
    if (intext[sch] == 'Ь' or intext[sch] == 'Ъ')
    {
        znak++;
        totalNums++;
    }
    if (intext[sch] == 'Ы')
    {
        ii++;
        totalNums++;
    }
    if (intext[sch] == 'Э')
    {
        ie++;
        totalNums++;
    }
    if (intext[sch] == 'Ю')
    {
        u++;
        totalNums++;
    }
    if (intext[sch] == 'Я')
    {
        ia++;
        totalNums++;
    }


    else
    {
        sch++;
    }
}
}
if (totalNums == 0)
{
    cout &lt;&lt; &quot;нет корректной входной последовательности \n&quot;;
}
else
{
    cout &lt;&lt; &quot;A = &quot; &lt;&lt; a / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Б = &quot; &lt;&lt; b / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;В = &quot; &lt;&lt; v / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Г = &quot; &lt;&lt; g / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Д = &quot; &lt;&lt; d / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Е = &quot; &lt;&lt; e / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ё = &quot; &lt;&lt; ee / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ж = &quot; &lt;&lt; j / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;З = &quot; &lt;&lt; z / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;И = &quot; &lt;&lt; i / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Й = &quot; &lt;&lt; ii / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;К = &quot; &lt;&lt; k / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Л = &quot; &lt;&lt; l / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;М = &quot; &lt;&lt; m / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Н = &quot; &lt;&lt; n / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;О = &quot; &lt;&lt; o / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;П = &quot; &lt;&lt; p / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Р = &quot; &lt;&lt; r / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;С = &quot; &lt;&lt; s / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Т = &quot; &lt;&lt; t / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ф = &quot; &lt;&lt; f / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Х = &quot; &lt;&lt; h / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ц = &quot; &lt;&lt; c / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ч = &quot; &lt;&lt; ch / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Щ = &quot; &lt;&lt; cha / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ъ/Ь = &quot; &lt;&lt; znak / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Э = &quot; &lt;&lt; ie / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Ю = &quot; &lt;&lt; u / totalNums &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Я = &quot; &lt;&lt; ia / totalNums &lt;&lt; &quot;\n&quot;;
}


}

sanok10
  • 47
  • 5
    Возможный дубликат вопроса: Русский язык в консоли – dIm0n Sep 30 '20 at 14:34
  • 1
    да, скорее всего и там кириллица в utf-8. – KoVadim Sep 30 '20 at 14:37
  • Да там утф-8 Р - это 0xD0 - половина буквы. вам надо сначала полученный массив прочитать в переменную типа std::wstring и работать тогда с текстом посимвольно, выводить c/на консоль можно через std::wcout/std::wcin тогда с отображением будет все нормально. либо переделать все в однобайтовую кодировку – Yakov Sep 30 '20 at 16:50
  • в заголовочном файле #include есть методы для преобразования из однобайтовой кодировки в многобайтовую и обратно. std::wstring_convert<std::codecvt_utf8_utf16< std::wstring::value_type >, std::wstring::value_type> utf16conv; std::wstring wString = std::wstring(тут указать адрес(переменную) буфера с текстом из файла); utf16conv.to_bytes(wString); в результате на выходе будет однобайтовая строка. – Yakov Sep 30 '20 at 16:50
  • P.S. Если регистр символов в частоте не важен, то сделайте мап типа буква <=> целое(с приведением букв в один регистр). идите по строке если символа в мапе нет вставляйте со значением 1, если есть, инкрементируйте значение. тогда все можно будет сделать одним циколом по строке. – Yakov Sep 30 '20 at 16:54
  • @Yakov это хедер <codecvt> и он считается устаревшим – dIm0n Sep 30 '20 at 20:42
  • @Yakov я не очень понимаю эту страшную конструкцию в конце комментария, а в неизменном виде она не работает. Можете разъяснить подробнее/привести более понятный пример/дать ссылку на подробный материал – sanok10 Oct 01 '20 at 01:07
  • По пводу хидера не могу сказать, код на 2017й VS компилируется без ворнингов. я не стремлюсь работающий код переделывать каждые полгода год как выйдет новый стандарт. попробуй для начала изменить кодовую страницу перед выводом кириллицы. примерно так `#include #include

    int main() { const char * byte_array = "Привет мир!"; std::string text(byte_array); system("chcp 1251"); std::cout << text << std::endl; return 0; } `

    – Yakov Oct 01 '20 at 14:07

0 Answers0