Программирование на C - 1 дополнение к концу файла

Для начала я новичок в C.

Я наткнулся на пример, который попросил пользователя расшифровать c-файл (который содержит дополнение 1 другого c-файла).

Обычно вы копируете символы, используя следующую инструкцию

    while ((ch = fgetc(fs)) != EOF)

но у меня возникли проблемы при расшифровке файла. Я попробовал следующее -

    while (~(ch = fgetc(fs)) != EOF)

результат - программа заходит в неопределенный цикл. Я пытался использовать значение EOF в ASCII (которое равно 26), но даже это не сработало в мою пользу.

Любая помощь будет оценена. Заранее спасибо.


/ * программа для расшифровки файла */

Вот полный код -

    #include<stdio.h>
    #include<stdlib.h>

    void main()
    {
        FILE *fs, *ft;
        char ch;

        fs = fopen("xyz.c", "r");
        ft = fopen("xyz1.c", "w");

        if((fs == NULL) || (ft == NULL))
        {
            printf("Cannot open the file.\n");
            exit(1);
        }

        while (~(ch = fgetc(fs)) != EOF)
            fputc(~ch, ft);

        fclose(fs);
        fclose(ft);
    }

2 ответа

Решение

EOF - это маркер, который сигнализирует о достижении конца файла (или потока). Теперь такой маркер не обрабатывается вами - вы не можете изменить его (или зашифровать в данном случае), так как он управляется внутренней файловой системой.

Поэтому проверка на ~EOF является логически неправильным и будет ловить только это конкретное значение (EOF является -1 на большинстве реализаций, так ~-1 является 0).

Просто:

int ch;
while ( (ch = fgetc(fs)) != EOF )
    int decoded = ~ch;

Вам нужно сравнить возвращаемое значение с fgetc(fs) в EOF, Применять только ~ оператор к нему после того, как вы сделали это сравнение.

И применяя ~ к результату fgetc() собирается вызвать проблемы. Например, если вы прочитали письмо 'a', значение ch (который должен быть int не char) будет 97 (предполагая систему на основе ASCII). ~97 будет очень большое отрицательное число, вероятно, где-то около -2 миллиардов. Вам нужно будет взять только младшие биты результата.

Другие вопросы по тегам