Цикл for не получает fgetc

Я пытаюсь заставить команду fgetc работать в очень простом цикле for. Хотя (каламбур) он работает в цикле while, он не работает в цикле for, и я не могу понять, почему.

Он должен просто взять все, что находится в текстовом файле, и распечатать его в зашифрованном виде с шагом len. Чтобы сравнить оригинал, я создал цикл for, который выполняется len раза, чтобы снова получить fgetc и распечатать исходное сообщение.

Цикл проходит, но я не могу понять, почему он не получает значение fgetc в источнике char.

#include <stdio.h>

int len;
char ch;
char source;

int main(void)
{
    FILE* text = fopen("welt.txt", "r");
    
    while((ch = fgetc(text)) != EOF)
    {
        printf("%c", ch + len);
        len++;
    }
    
    printf("\n%i\n", len);
    
    for (int i = 0; i < len; i++)
    {
        source = fgetc(text);
        printf("%c", source);
    }
}

person Joesns    schedule 14.01.2021    source источник
comment
В цикле for вы уже находитесь в конце файла. Добавьте rewind(text) перед ним.   -  person Weather Vane    schedule 14.01.2021
comment
Используйте rewind(text), чтобы заставить его работать до for, потому что он достиг EOF в while   -  person IrAM    schedule 14.01.2021
comment
Хотел бы я, чтобы это всегда было так просто.. Спасибо!!   -  person Joesns    schedule 14.01.2021
comment
Также измените char ch, source; на int ch, source;. Функция fgetc() возвращает int. На самом деле почти каждая библиотечная функция, работающая с символами, использует не char, а int (если только это не массив в виде строки C).   -  person Weather Vane    schedule 14.01.2021
comment
Вы не можете просто проверить против len. Вам все равно нужно проверить, возвращает ли fgetc EOF, так как нет гарантии от ошибок чтения или от того, что файл не изменится. Действительно, вы даже не проверили, прервался ли первый цикл из-за достижения конца потока или из-за ошибки чтения.   -  person William Pursell    schedule 14.01.2021


Ответы (1)


Добавление перемотки для сброса fgetc на первую позицию в текстовом файле помогает.

rewind(text);

for (int i = 0; i < len; i++)
{
    source = fgetc(text);
    printf("%c", source);
}
person Joesns    schedule 14.01.2021