powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как все же отловить eof
25 сообщений из 63, страница 1 из 3
как все же отловить eof
    #39946216
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите, пожалуйста, не могу въехать в такую важную суть как eof.

использую Visual Studio, Window 7 .

Как мне отловить eof этот несчастный ?
ввел пару символов, а потом нажал Ctrl + z.
ну посмотрел отладчиком последний символ в переменной c имеет код x1a .
ну это ж не eof никакой. тогда как выловить ?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h> 
int main()
{    
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
      printf("%c\n",c);
    return 0;    
}
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946222
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81последний символ в переменной c имеет код x1a .

Это первый символ, а не последний. Продолжай пошаговое выполнение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946226
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Мне показалось что последний. Так как потом промсходит опять опрос ввода с клавиатуры getchar, а значит поток пуст
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946227
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946228
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().

Да, это и есть C.
Обязательно прислушаюсь. Но чтобы перейти на c++ сначала книжку керригана надо все же от корки до корки пройти, а там с.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946229
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().

Да, это и есть C.
Обязательно прислушаюсь. Но чтобы перейти на c++ сначала книжку керригана надо все же от корки до корки пройти, а там с.

Читай дальше, забудь про EOF, это неважно и сегодня ненужно
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946234
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Хотелось бы все же минимизировать пробелы
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946240
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ну посмотрел отладчиком последний символ в переменной c имеет код x1a .
ну это ж не eof никакой.
Eof, просто юникодный, а вы ждете ASCII-шный.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946241
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010,

То есть условие цикла смысла не имеет?
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946242
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T,
Хотелось бы все же минимизировать пробелы

Пробелы чего? Бесполезных знаний? Зачем? Книга писалась 50 лет назад, за это время кое-что поменялось, кое-что стало не актуальным. Но основа осталась как есть.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946249
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Мне показалось что последний.

Тебе показалось. Продолжай отладку пока не произойдёт выход из цикла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946318
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
bk0010,
То есть условие цикла смысла не имеет?
Имеет. Но надо или вернуться к Visual Studio 6, или конвертировать символ при помощи widechartomultibyte или какой-нибудь аналогом, или поискать и применить #define _ANSI (или MBCS, давно уже не сталкивался, пишу по памяти по аналогии с древним #define _UNICODE)
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946324
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010
bk0010,
Но надо или вернуться к Visual Studio 6


а что вот это значит ?
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946327
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81а что вот это значит ?

Ничего важного. Продолжай пошаговую отладку, не отвлекайся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946332
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81а что вот это значит ?

Ничего важного. Продолжай пошаговую отладку, не отвлекайся.


да, спасибо. вроде бы получилось. eof научился вызывать.
немного скорректировал код. примечательно, что спровоцировать eof получается
только когда новая строка (поток пуст) и нажимаем Ctrl + z.
Если я не прав и есть желание , то поправьте мои наблюдения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h> 
int main()
{
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
    printf("Last code symbol %d\n", c);
    return 0;
}
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946341
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946371
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай цикл с постусловием, может легче увидеть будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <stdio.h> 
int main()
{
    int c;

    do {
        c = getchar();
        putchar(c);
    } while (c  != EOF);

    printf("Last code symbol %d\n", c);
    return 0;
}



andron81
да, спасибо. вроде бы получилось. eof научился вызывать.
немного скорректировал код. примечательно, что спровоцировать eof получается
только когда новая строка (поток пуст) и нажимаем Ctrl + z.
Если я не прав и есть желание , то поправьте мои наблюдения
Ctrl+z это такая же буква как и все остальные буквы алфавита. Она может быть внутри потока байт который ты читаешь из файла или с клавиатуры. Это просто традиция овеянная веками - считать ее за EOF. При этом она не является концом строки. Она конец файла, но не конец строки. И поэтому от прямого использования EOF уже давно отказались. Твой оригинальный код должен был выглядеть так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h> 
int main()
{    
    int c;

    while (c = getchar())
        putchar(c);
      printf("\nlast = %d\n",c);
    return 0;    
}


Потому что getchar() вернет ноль (оно же false) как в случае реального окончания файла, так и в случае нахождения строки с единственным символом EOF.


А вот Dima T не слушай, он в этом топике глупости говорил. EOF унаследован не из С, а из телетайпов - задолго до С. Вот там, не было физического конца файла, потому и требовался специальный символ, а когда в 1960-ом году создавали "стандарт" ASCII просто взяли все имеющиеся на сегодня специальные буквы телетайпа и воткнули их на первые 32 знакоместа в таблице.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Фондовые биржи до сих пор используют символ SOH (0x01) как разделитель между атрибутами биржевого протокола.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946382
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946383
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.


Вот и я так же прочитал в описании getchar. Так что скорее всего это никак не буква как писал товарищ выше. А скорее всего это состояние, ну то что определяется макросом это уже детали.

Смущает только одно: почему я могу вызвать eof только когда поток пуст. То есть в этом случае я могу ctrl z щелкнуть. И тогда цикл именно МОЙ последний завершит работу.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946386
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А когда вы будете читать текстовый поток в юниксах, то состояние "конец файла" будет формировать символ Ctrl+D. "Вот это поворот"

P.S.
Работаете с API - следуйте документации этого API.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946389
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
А когда вы будете читать текстовый поток в юниксах, то состояние "конец файла" будет формировать символ Ctrl+D. "Вот это поворот"

P.S.
Работаете с API - следуйте документации этого API.


Разумеется. Я в первом сообщении и указал какая у меня операционка и кстати и от ide там зависит наверно тоже, не ctrl z, а возможно сам eof может быть описан другой константой.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946394
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81а возможно сам eof может быть описан другой константой.
А какой константой EOF описан у Вас?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946395
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функции посимвольного чтения возвращают целое. Значения больше нуля - символы, а минус единица - признак конца ввода. Но пользоваться всё равно надо константой.
Функция посимвольного чтения может возвращать символы с очень разными кодами, включая управляющие. Взялись работать на низком уровне - будьте готовы принять "необычные значения".
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946398
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonegetchar() возвращает int, не char.

Вообще-то по-жизни (то есть изначально) она возвращала именно char. В int её перековали
относительно недавно, когда внезапно обнаружилась буква "я" в кодировке Windows-1251.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / как все же отловить eof
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]