LINUX.ORG.RU
решено ФорумTalks

сколько байтов ?

 , ,


1

2

тему пилить в «разработке» не стал , ибо опять зафлудят . вопрос таков: сколько байтов за раз считывает getchar() ? есть такой код

#include <stdio.h>
/*
 *
#define EOF -1 - так определен конец файла в stdio.h
 *
 */
int main()
{
    int c;
    c = getchar();
    while(c!=EOF)
    {
        putchar(c);
        c = getchar();
    }
}
c - 4 байта . при вводе -1 цикл должен завершиться и программа должна следом завершиться , но этого не происходит . ЧЯДНТ ? как сделать правильно ? мб getchar() ест только 1 байт из 4-х ?


Ответ на: комментарий от gv

прочитано . конкретно не сказано . в книге K&R тоже не сказано .
если сказать по делу не можете , то , пожалуйста , вообще ничего не говорите . спасибо .

conf ()

Мануалы читать уже не модно? getchar читает из stdin один байт (символ) и возвращает его, как unsigned char, преобразованный в int. В случае ошибки или конца файла возвращается EOF.

при вводе -1 цикл должен завершиться и программа должна следом завершиться

При вводе -1 ты посылаешь в буфер stdin два символа — '-' и '1', соответственно, цикл у тебя выполниться два раза и будет выполнятся дальше. Чтобы вызвать в stdin значение EOF, нужно нажать комбинацию Ctrl+D.

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

прочитано . конкретно не сказано

У тебя, видно, мануалы другие.

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

Ctrl+D

так бы сразу и ... спасибо , короче . есть аналоги этого сочетания клавиш среди клавиш F1~F12 ? а то у меня контролы передохли (необъяснимо , но факт) .

У тебя, видно, мануалы другие.

все возможно . я только начинаю .

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

прочитано . конкретно не сказано . в книге K&R тоже не сказано .

Я же проверил, перед тем как написать.

если сказать по делу не можете , то , пожалуйста , вообще ничего не говорите . спасибо .

Можем, раз в мане не понятно:

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.

getchar() is equivalent to getc(stdin).

То есть, getchar() читает один символ (unsigned char, то есть один байт), преобразует его в int (более одного байта, например 4) и возвращает.

Если был достигнут конец файла, возвращает специальное значение EOF. EOF не является значением unsigned char, но является значением int,
что гарантирует, что оно может быть возвращено только в случае конца файла.

В вашей реализации libc EOF равен -1, а значит getchar() может вернуть либо число 0..255 (код символа), либо -1.

gv ()
Ответ на: комментарий от conf

так бы сразу и ... спасибо , короче . есть аналоги этого сочетания клавиш среди клавиш F1~F12 ? а то у меня контролы передохли (необъяснимо , но факт) .

Повесь control на capslock. Или на другую клавишу. Вообще не понимаю, как можно жить без control.

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

Посмотрите man stty и поищите там eof :)

спасибо . сделал так:

stty eof ^Z
значение stty
eof = ^Z; eol = M-^?; eol2 = M-^?; swtch = M-^?;
не помогло .
theNamelessOne

Повесь control на capslock. Или на другую клавишу.

ок . попробую . спасибо .

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

stty eof ^Z

Потому что ^Z уже занята для посылки SIGSTOP.

Вот так, например, работает:

stty eof '^A'
cat
^A

На счет функциональных не уверен, но коды клавиш покажет showkey -s.

gv ()
#include <stdio.h>

int main(){
        int c;
        while((c = getchar()) != EOF) putchar(c);
        return 0;
}
saahriktu ★★★★★ ()
Ответ на: комментарий от conf

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.

getchar() is equivalent to getc(stdin).


прочитано . конкретно не сказано

Ну да, конкретно про getchar не сказано. Сказано только про fgetc. :D

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

А откуда вообще передаются данные на вход программы? Для обычного конвейера ничего специального не нужно:

> echo "проверка" | ./test
проверка
>

saahriktu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.