LINUX.ORG.RU

Запутался в сишных getc/putc

 , ,


0

3

Вот что не так делаю?

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

#include<stdio.h>
int main()
{
   int  ch=0; /* Можно вместо int написать char, не присваивать нуль и т.п. */
   while((ch=getc(stdin)!=EOF))  /* можно getchar()  */
   {
      putc(ch,stdout);  /* можно putchar(ch) */
   }
   return 0;
}

Компилирую gcc -o getcputc getcputc.c

Затем просто копирую какой-нибудь файл, например:

$ cat a.mkv |./getcputc > b.mkv

Создается b.mkv такой же длины как и a.mkv, но все байты в нем равны 0x01h Подумал, что может потоки перемешиваются. Если вместо stdout поставить stderr программа вообще висит на длинных файлах, а на коротких вывод нулевой длины. Если открыть через fopen() файл и выводить туда в putc, то тоже все байты 01. Не зависит от наличия fclose()

Чувствую, что в чем-то элементарном запутался, но не могу понять в чем.

Решение: Глаз замылился со скобками Запутался в сишных getc/putc (комментарий)

★★★★★

Последнее исправление: praseodim (всего исправлений: 3)
Ответ на: комментарий от utf8nowhere

Круто

Опечатка, когда редактировал сообщение. Реально просто int ch;

И кстати, int char не скомпилируется.

Нет

Можно, компилятор хавает. Результат такой же.

praseodim ★★★★★
() автор топика
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от utf8nowhere

Уууу, блин. Спасибо! Глаз замылился совершенно и главное даже ворнингов никаких не было.

Сейчас пытаюсь сообразить, что оно делало с результатом getc =)))

Можно вопрос на собеседованиях задавать)

praseodim ★★★★★
() автор топика
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от praseodim

Сейчас пытаюсь сообразить, что оно делало с результатом getc =)))

Проверяло что не EOF, цикл выполнялся пока это было так (1 получается когда условие != истинно)

utf8nowhere ★★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от praseodim

Можно, компилятор хавает. Результат такой же.

Хавать то он может и хавает, но вот EOF больше не сможешь получить.

beastie ★★★★★
()

Ещё это в манах явно прописано:

The getchar() function is equivalent to getc(stdin).

The putchar() function is identical to putc() with an output stream of stdout.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Это-то я знаю. Просто на всякий уже случай проверял.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от beastie

Сейчас проверил. Текстовый файл нормально обработался. Бинарный срезался на 0xffh. Собственно, так и должно было быть, но интересно все же, что без вопросов скомпилировалось и даже работало.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от beastie

вот EOF больше не сможешь получить

Сможет, это же -1, а char по умолчанию signed. Проблема будет с символом 255, который будет восприниматься как EOF.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Тут можно поспорить. Ибо он получает не EOF, а символ 255, который ошибочно интерпретируется как EOF.

beastie ★★★★★
()
Ответ на: комментарий от praseodim

Landin с рыбой книга

Expert C Programming (by Peter van der Linden).

ну и даже Фьюер Задачи по Си в одном кодексе с K&R

прикол с отсутсвующими скобками стандартная грабля Сяшки(ибо ассемблер)

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)

Шо, наэкономил пробелов?

vbr ★★★★★
()
Ответ на: комментарий от no-such-file

Заглянул сейчас в файл stdio.h, вот прототипы этих функций:

int getc(FILE* _Nonnull __fp);
int getchar(void);

C, конечно, приводит типы при необходимости, но правильность работы не гарантирует.

Megaorcus
()
21 августа 2025 г.
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.