Почему последний символ читается 2 раза - C (СИ)
Формулировка задачи:
int main() {
FILE *fp = fopen("D:\\test.txt", "rb");
unsigned short int ch = 0;
char bin[9] = {0};
if(fp != NULL) {
while(!feof(fp)) {
fread(&ch, 1, 1, fp);
dec2bin(ch, bin);
printf("%s %d %c\n", bin, ch, ch);
}
}
printf("\n");
return 1;
}Решение задачи: «Почему последний символ читается 2 раза»
textual
Листинг программы
while(fread(&ch, 1, 1, fp))
{
dec2bin(ch, bin); /* поразумеваем, что dec2bin всегда отрабатывает без ошибок */
if(printf("%s %d %c\n", bin, ch, ch) < 0)
{
report_error("printf");
do_something_on_error("printf");
}
}
if(ferror(fp))
{
report_error("fread");
do_something_on_error("fread");
}
Объяснение кода листинга программы
chобъявлен как символ, и он считывается из файла с помощью функцииfread().- Функция
dec2bin()преобразует числовое значениеchв двоичное представление и сохраняет его в переменнойbin. - С помощью функции
printf()выводится двоичное представлениеbin, числовое значениеchи символch. - Если
printf()возвращает значение меньше нуля, значит произошла ошибка и мы переходим к блоку обработки ошибок. - Если файл закрыт неудачно, то есть ошибка чтения, мы также переходим к блоку обработки ошибок.
- Если в блоке обработки ошибок происходит ошибка, то вызывается функция
report_error(), которая выводит сообщение об ошибке. - Если происходит ошибка чтения или записи, вызывается функция
do_something_on_error(), которая выполняет дополнительные действия при возникновении ошибки. - Если происходит ошибка чтения файла, вызывается функция
report_error(fread)для вывода сообщения об ошибке чтения файла. - Если происходит ошибка чтения файла, вызывается функция
do_something_on_error(fread)для выполнения дополнительных действий при возникновении ошибки чтения файла.