Программирование на 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 миллиардов. Вам нужно будет взять только младшие биты результата.