Программа не работает с файлами, содержащими кириллицу C++

Задание: Дан текстовый файл Ф1. Каждую строку нечётной длины перевернуть и записать в файл Ф2.

Код:

#define L 15
#define N 300

char* Reverse_Odd(char string[])
{
    int i, j, k = 0;
    char copy[N];
    for (i = 0; string[i] != '\0'; i++) copy[i] = string[i];
    if ((i - 1) % 2 != 0)
    {
        for (j = i - 2; j >= 0; j--)
        {
            string[k] = copy[j];
            k++;
        }
    }
    return string;
}

void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    FILE *f1, *f2;
    char fname[L], str[N], *res;
    printf("\n Введите имя файла: ");
    gets_s(fname);
    if ((f1 = fopen(fname, "r")) == NULL)
    {
        puts("Ошибка при открытии исходного файла!");
        return;
    }
    if ((f2 = fopen("f2.txt", "w")) == NULL)
    {
        puts("Ошибка при создании файла-результата!");
        return;
    }
    while (1)
    {
        fgets(str, N, f1); 
        if (feof(f1)) break;
        res = Reverse_Odd(str); 
        fputs(res, f2); 
    }
    _fcloseall();
}

Программа работает, но если исходный файл содержит кириллицу, то в файле-результате текст меняется на набор странных символов. Как сделать, чтобы программа корректно работала с кириллицей, не используя для этого сильно продвинутые функции?


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

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

Ваша программа не работает с файлами, содержащими кириллицу, потому что функция Reverse_Odd не корректно обрабатывает строки с кириллицей. В кодировке UTF-8 символы кириллицы кодируются двумя или более байтами, поэтому при обращении к строке как к массиву символов вы можете получить некорректные результаты.Кроме того, функция Reverse_Odd возвращает указатель на локальный массив copy, который уничтожается после выхода из функции, что приводит к неопределенному поведению.Вам следует использовать стандартные функции и классы C++ для работы со строками и файлами. Например, вы можете использовать std::string для работы со строками и std::ifstream и std::ofstream для чтения и записи файлов.

→ Ссылка