Ошибка в программе на циклический сдвиг

Задача считать строку текста из файла и циклически сдвигать её влево на три позиции (и записывать в другой файл). Но при записи появляются символы "я".

#include <stdio.h>
#include <string.h>

int main() {
    char str[200], c;
    int i = 0, j, k, curMove = 3;
    FILE* aa, * bb;
    fopen_s(&aa, "//Mac/Home/Desktop/laba4_5/problem_no_2/aa.txt", "r");
    fopen_s(&bb, "//Mac/Home/Desktop/laba4_5/problem_no_2/bb.txt", "w");
    c = fgetc(aa);
    while (c != EOF) {
        k = 0;
        while (c != EOF && c != '\n') {
            str[i] = c;
            i++;
            c = fgetc(aa);
            k++;
        }

        j = curMove%k;
        while (j < k) {
            fputc(c, bb);
            j++;
        }
        for (j = 0; j < curMove % k; j++)
            fputc(c, bb);
            
        
    }
    fclose(aa);
    fclose(bb);
    return 0;
}

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

Автор решения: Vladimir Ignatenko
  1. Вы считываете данные из файла построчно в массив str Но потом этот массив не используете. А пишите в файл, значение из переменной c. А по логике там у вас символ конца файла. Он и даёт "я".

  2. Конструкция j = curMove%k; очень странная. Вы получаете остаток от деления числа 3 (которое в curMove) на длину строки, которую посчитали в k. Для всех случаев когда строка длинее чем 3 символа j будет равняться 3. По сути данная операция и не нужна наверное. Как и переменная curMove

  3. Есть еще сомнения во вложенности циклов while - но в общем-то такая конструкция должна работать более или менее нормально.

  4. И наверное оптимальнее было бы считывать сразу строку, и уже с ней работать. Считывание и запись файлов посимвольно - не очень оптимально.

→ Ссылка
Автор решения: Harry

Начнем с того, что

c = fgetc(aa);

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

Потом, вы выводить пытаетесь один и тот же символ

fputc(c, bb);

а не символы строки...

Начните с исправления этих ошибок.

→ Ссылка