LINUX.ORG.RU

Когда же будет этот EOF


0

0

Предположим есть код на С

............
int c;
while((c = getchar()) != EOF){
     printf("%d\t",c); /*тут вообще от фонаря*/
}
............

так вот, вводя с консоли что-то, мы тут же это "что-то" печатаем, но 
когда же будет конец программы? Как задать этот самый EOF с клавиатуры?

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

Попробовал, такой код

#include <stdio.h>

main()
{
 int c;
 while((c = getchar()) != EOF)
  c = getchar();
 printf("EOF = %d",c);
}

в результате выполнения программы, она выдаетс значение EOF по Ctrl-D
только на второй раз! т.е. вводим символы, потом вводим Ctrl-D - нет
никакого результата, потом еще раз, и только тогда программа завершается
EOF = -1

Вопрос: почему надо нажимать  Ctrl-D два раза подряд, а не хватает одного?

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

Компилируем код gcc: ./a.exe(out) [Ctrl + D] Вылет нормальный, с указанием EOF = -1

Компилируем код bcc32 и после запуска сразу [Ctrl + Z] // Z из-за виндозности Тоже вылет нормальный, с указанием EOF = -1

Наверное компилятор у тебя левый.

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

Уважаемый, а где проверочка на EOF при чтении символа внутри цикла?
Если EOF случиться при вызове getchar() не в условии while, то и
нужно Вам бужет жать Ctrl+D ещё раз :)

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

>Вопрос: почему надо нажимать Ctrl-D два раза подряд, а не хватает одного?

Для 1-го случая

int c;
while((c = getchar()) != EOF){
     printf("%d\t",c); /*тут вообще от фонаря*/
}

возможно 1-й раз жмешь Ctrl-D в конце непустой строки.
Жми Ctrl-D в пустой сроке.

Для 2-го - romanSA объяснил.

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

 int c;
 while((c = getchar()) != EOF)
  c = getchar();

Хотя странно. Если конец файла во втором getchar(), то на слудующей
итерации вызов 1-го getchar() не должен ждать ввода и сразу вернуть
EOF.

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

Специально после запуска проги набил пару букв - чтобы в тело цикла был осуществлен вход, потом Ctrl-D - тишина, потом еще раз Ctrl-D и вывел нужный результат, просто интересно даже :)

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

Ну не знаю ... Вот это работает как надо:

--------------------------------------
#include <stdio.h>

main()
{
        int c;
        while((c = getchar()) != EOF){
                printf("%d\t",c);
        }
        return 0;
}
--------------------------------------

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

Мда, просто чедеса - скопировал один в один, запустил - опять надо жать два раза ;( Какой у вас gcc? у меня

gcc version 3.3.5 (Debian 1:3.3.5-5)

Может у кого таже версия? Может попробуете как оно у вас?

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

gcc (GCC) 3.2.2 20030222 (ASPLinux 3.2.2-5asp)

Не думаю, что дело в gcc. getchar - библиотечная функция, которая
используется другими программами. Да и сами эти программы были собраны
этим же компилятором. Баг на таком простом примере означал бы, что у вас
должны глючить почти все программы, тем более Debian - маловероятно.

Может вы неправильно воспринимаете происходящее. Попробуйте отследить
на поведении cat.
-----------------------------
[cs@const ~]$ cat
123<Enter>
123
456<Enter>
456
<Ctrl-D>
[cs@const ~]$ cat
123<Enter>
123
456<Ctrl-D>456<Ctrl-D>[cs@const ~]$
-----------------------------

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

PS

>Мда, просто чедеса - скопировал один в один, запустил - опять надо жать два раза

Сделай такой тест - создай текстовый файл, набей в него что-нибудь и выполни команду:

$ proga_kotoruu_ty_skompilil < text_file

Если правильно выведет файл - все в порядке. Т.е. у тебя такой терминал. Надеюсь ты обратил внимание, что в последнем примере я тоже жал Ctrl-D два раза в непустой строке.

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

Спасибо за ответы! Сейчас под рукой нету Linux, как домой приеду - сразу попробую - идея интересная!

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

Значит по-порядку; 1) Все тесты с cat были проведены - поведение терминала точно такое же как и у тебя 2)Провел тест с текстовым файлом - программа нормально завершается с нужным результатом

Интересно, что если в непустой строке нажать Ctrl-D, то программа (в нашем случае cat) не завершиться, а выведет то, что было до нее? т.е как было 456

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