Цикл For не принимает fgetc

#c #for-loop #fgetc

#c #цикл for #fgetc

Вопрос:

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

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

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

 #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%in", len);
    
    for (int i = 0; i < len; i  )
    {
        source = fgetc(text);
        printf("%c", source);
    }
}
 

Комментарии:

1. В for цикле вы уже находитесь в конце файла. Добавьте rewind(text) перед ним.

2. Используйте rewind(text) , чтобы заставить его работать раньше for , потому что он достиг EOF в while

3. Хотелось бы, чтобы это всегда было так просто.. Спасибо!!

4. Также, пожалуйста, измените char ch, source; на int ch, source; . Функция fgetc() возвращает int . На самом деле почти каждая библиотечная функция, которая имеет дело с «символами», не использует char but int (если это не массив в виде строки C).

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

Ответ №1:

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

 rewind(text);

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