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)
Ответ на: комментарий от beastie

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

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

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

Expert C Programming (by Peter van der Linden).

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

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

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от no-such-file

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

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

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

Megaorcus
()