Ошибка в программе на циклический сдвиг
Задача считать строку текста из файла и циклически сдвигать её влево на три позиции (и записывать в другой файл). Но при записи появляются символы "я".
#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 шт):
Вы считываете данные из файла построчно в массив str Но потом этот массив не используете. А пишите в файл, значение из переменной c. А по логике там у вас символ конца файла. Он и даёт "я".
Конструкция
j = curMove%k;очень странная. Вы получаете остаток от деления числа 3 (которое в curMove) на длину строки, которую посчитали в k. Для всех случаев когда строка длинее чем 3 символа j будет равняться 3. По сути данная операция и не нужна наверное. Как и переменная curMoveЕсть еще сомнения во вложенности циклов while - но в общем-то такая конструкция должна работать более или менее нормально.
И наверное оптимальнее было бы считывать сразу строку, и уже с ней работать. Считывание и запись файлов посимвольно - не очень оптимально.
Начнем с того, что
c = fgetc(aa);
c у вас char, а значит, вы никак не отличите EOF, который в char не должен влезать по определению, от char наподобие я.
Потом, вы выводить пытаетесь один и тот же символ
fputc(c, bb);
а не символы строки...
Начните с исправления этих ошибок.