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