Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Помогите, пожалуйста, не могу въехать в такую важную суть как eof.

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

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


#include <stdio.h> 
int main()
{    
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
      printf("%c\n",c);
    return 0;    
}
11 апр 20, 19:42    [22114720]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

andron81
последний символ в переменной c имеет код x1a .

Это первый символ, а не последний. Продолжай пошаговое выполнение.

Posted via ActualForum NNTP Server 1.5

11 апр 20, 20:01    [22114728]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov,

Мне показалось что последний. Так как потом промсходит опять опрос ввода с клавиатуры getchar, а значит поток пуст
11 апр 20, 20:21    [22114738]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dima T
Member

Откуда:
Сообщений: 14727
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().
11 апр 20, 20:34    [22114742]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dima T
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().

Да, это и есть C.
Обязательно прислушаюсь. Но чтобы перейти на c++ сначала книжку керригана надо все же от корки до корки пройти, а там с.
11 апр 20, 20:39    [22114743]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dima T
Member

Откуда:
Сообщений: 14727
andron81
Dima T
EOF это бред унаследованный из C, нездоровая методология, его просто не надо пользовать, пользуйся fread().

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

Читай дальше, забудь про EOF, это неважно и сегодня ненужно
11 апр 20, 20:46    [22114747]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dima T,
Хотелось бы все же минимизировать пробелы
11 апр 20, 20:51    [22114754]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
bk0010
Member

Откуда:
Сообщений: 4935
andron81
ну посмотрел отладчиком последний символ в переменной c имеет код x1a .
ну это ж не eof никакой.
Eof, просто юникодный, а вы ждете ASCII-шный.
11 апр 20, 21:02    [22114763]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
bk0010,

То есть условие цикла смысла не имеет?
11 апр 20, 21:04    [22114764]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dima T
Member

Откуда:
Сообщений: 14727
andron81
Dima T,
Хотелось бы все же минимизировать пробелы

Пробелы чего? Бесполезных знаний? Зачем? Книга писалась 50 лет назад, за это время кое-что поменялось, кое-что стало не актуальным. Но основа осталась как есть.
11 апр 20, 21:04    [22114765]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

andron81
Мне показалось что последний.

Тебе показалось. Продолжай отладку пока не произойдёт выход из цикла.

Posted via ActualForum NNTP Server 1.5

11 апр 20, 21:31    [22114782]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
bk0010
Member

Откуда:
Сообщений: 4935
andron81
bk0010,
То есть условие цикла смысла не имеет?
Имеет. Но надо или вернуться к Visual Studio 6, или конвертировать символ при помощи widechartomultibyte или какой-нибудь аналогом, или поискать и применить #define _ANSI (или MBCS, давно уже не сталкивался, пишу по памяти по аналогии с древним #define _UNICODE)
12 апр 20, 12:02    [22114912]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
bk0010
bk0010,
Но надо или вернуться к Visual Studio 6


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

Сообщение было отредактировано: 12 апр 20, 12:37
12 апр 20, 12:38    [22114922]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

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

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

Posted via ActualForum NNTP Server 1.5

12 апр 20, 12:55    [22114928]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

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

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


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

#include <stdio.h> 
int main()
{
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);
    printf("Last code symbol %d\n", c);
    return 0;
}
12 апр 20, 13:17    [22114938]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Изопропил
Member

Откуда:
Сообщений: 31461
andron81,
https://stackoverflow.com/questions/31407173/getchar-continues-to-accept-input-after-including-ctrlz-in-same-line
12 апр 20, 13:57    [22114957]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
сделай цикл с постусловием, может легче увидеть будет
#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 уже давно отказались. Твой оригинальный код должен был выглядеть так:

#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 знакоместа в таблице.
12 апр 20, 17:31    [22115013]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Да. Фондовые биржи до сих пор используют символ SOH (0x01) как разделитель между атрибутами биржевого протокола.
12 апр 20, 18:38    [22115026]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Barlone
Member

Откуда:
Сообщений: 1389
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
12 апр 20, 18:55    [22115030]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.


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

Смущает только одно: почему я могу вызвать eof только когда поток пуст. То есть в этом случае я могу ctrl z щелкнуть. И тогда цикл именно МОЙ последний завершит работу.
12 апр 20, 19:06    [22115032]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
А когда вы будете читать текстовый поток в юниксах, то состояние "конец файла" будет формировать символ Ctrl+D. "Вот это поворот"

P.S.
Работаете с API - следуйте документации этого API.
12 апр 20, 19:48    [22115042]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Basil A. Sidorov
А когда вы будете читать текстовый поток в юниксах, то состояние "конец файла" будет формировать символ Ctrl+D. "Вот это поворот"

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


Разумеется. Я в первом сообщении и указал какая у меня операционка и кстати и от ide там зависит наверно тоже, не ctrl z, а возможно сам eof может быть описан другой константой.
12 апр 20, 19:53    [22115045]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

andron81
а возможно сам eof может быть описан другой константой.
А какой константой EOF описан у Вас?

Posted via ActualForum NNTP Server 1.5

12 апр 20, 20:05    [22115052]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
Функции посимвольного чтения возвращают целое. Значения больше нуля - символы, а минус единица - признак конца ввода. Но пользоваться всё равно надо константой.
Функция посимвольного чтения может возвращать символы с очень разными кодами, включая управляющие. Взялись работать на низком уровне - будьте готовы принять "необычные значения".
12 апр 20, 20:06    [22115053]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

Barlone
getchar() возвращает int, не char.

Вообще-то по-жизни (то есть изначально) она возвращала именно char. В int её перековали
относительно недавно, когда внезапно обнаружилась буква "я" в кодировке Windows-1251.

Posted via ActualForum NNTP Server 1.5

12 апр 20, 20:09    [22115056]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
Dimitry Sibiryakov
Вообще-то по-жизни (то есть изначально) она возвращала именно char.
То, что у буржуев по жизни был signed char сильно раздражало не только советских
12 апр 20, 20:15    [22115059]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

Barlone
getchar() возвращает int, не char.

Вообще-то по-жизни (то есть изначально) она возвращала именно char. В int её перековали
относительно недавно, когда внезапно обнаружилась буква "я" в кодировке Windows-1251.


тогда интересно как в таком случае эта функция выдавала состояне eof , ведь все 255 символов задействованы, а байт отрицательное число не выдаст
12 апр 20, 20:16    [22115060]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dimitry Sibiryakov

andron81
а возможно сам eof может быть описан другой константой.
А какой константой EOF описан у Вас?


описан в stdio как -1
12 апр 20, 20:17    [22115062]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Basil A. Sidorov
Dimitry Sibiryakov
Вообще-то по-жизни (то есть изначально) она возвращала именно char.
То, что у буржуев по жизни был signed char сильно раздражало не только советских


а вот оно что... сигнет чар
12 апр 20, 20:18    [22115063]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
andron81
тогда интересно как в таком случае эта функция выдавала состояне eof
Неточная цитата из книги "Всё про TeX":
"Были рассмотрены и другие варианты кодировок, но необходимость использования более 128 кодов в общеупотребительных приложениях всё ещё неочевидна".
Высказывание принадлежит американскому национальному комитету стандартизации и сделано оно было в 1963 году.
а байт отрицательное число не выдаст
Нет в Це байтов - только char. И он, внезапно, может быть знаковым.

Сообщение было отредактировано: 12 апр 20, 20:23
12 апр 20, 20:21    [22115066]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Basil A. Sidorov

Це байтов - только char. И он, внезапно, может быть знаковым.


что это вы написали ???

Сообщение было отредактировано: 12 апр 20, 20:32
12 апр 20, 20:30    [22115070]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
andron81,

как я понимаю signed char это уже не байт. может это байт + 1 бит(фантазирую)? Но это тоже уже не байт )))))). но последнее я нигде не встречал, я думал, что всё это должно быть кратно 8.

Сообщение было отредактировано: 12 апр 20, 20:38
12 апр 20, 20:35    [22115073]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
А надо не фантазировать а читать учебники и заголовочные файлы.
char он всегда равен байту - это из учебника и стандарта языка.
signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII.
unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы.
И да, байт не всегда восьмибитный, но размер char всегда в один байт.
12 апр 20, 22:50    [22115120]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
Это такая несусветная глупость что просто "ОЙ".
12 апр 20, 22:52    [22115121]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
White Owl
А надо не фантазировать а читать учебники и заголовочные файлы.
char он всегда равен байту - это из учебника и стандарта языка.
signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII.
unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы.
И да, байт не всегда восьмибитный, но размер char всегда в один байт.


Для этого книги надо эти иметь. И дойти. У меня только керриган, ритчи. Для меня например новость, что байт может быть не восьмибитным. Это просто революция какая-то
12 апр 20, 23:22    [22115128]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
White Owl
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
Это такая несусветная глупость что просто "ОЙ".


Почему так уж разразились критикой?
Можете прокомментировать?
12 апр 20, 23:47    [22115135]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
andron81
White Owl
пропущено...
Это такая несусветная глупость что просто "ОЙ".


Почему так уж разразились критикой?
Можете прокомментировать?
Ну начать можно с того, что int и char это практически одно и то-же, отличающееся всего-лишь размером. Причем только возможно отличающиеся. По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char)
Поэтому заявлять что "getchar() возвращает int, не char." и делать из этого выводы не особо полезно.

Во вторых, если почитать конкретно документацию на getchar() то мы увидим:
man getchar
RETURN VALUE
fgetc(), getc() and getchar() return the character read as an unsigned
char cast to an int or EOF on end of file or error.


"И EOF - это целое число, не совпадающее ни с одним возможным значение char."
Угу... открываем stdlib.h и видим там строку:
#define EOF (-1)
Это очень сильно не совпадает с возможными значениями char.... Ага, ага.
Ну и никто же не запрещает сделать:
printf("%d %i %c\n", EOF, EOF, EOF);
И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1.


Вообще, когда пишешь на Си, очень полезно понимать как работает компьютер. Если для вас язык это что-то такое волшебное и мистическое - успеха не будет совсем. Для С++ это тоже будет полезным, но в меньшей степени. И чем более "высокий" язык, тем допустимая степень волшебности выше, для успешного написания программы.
13 апр 20, 02:03    [22115151]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
White Owl
Ну начать можно с того, что int и char это практически одно и то-же, отличающееся всего-лишь размером. Причем только возможно отличающиеся. По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char)
Педантизм, конечно, хорошо, но учёт давно уже старых реалий - ещё лучше.
man getchar
указал какая у меня операционка (c) andron81. Педантизм - он в обе стороны работает. Если так упирать на индивидуальные различия разных реализаций, то нехорошо ссылаться на совсем другую документацию.
Хотя ...

P.S.
Есть, конечно, у меня справочник по Це тысяча девятьсот семьдесят шестого, что ли, года издания. Девять бит в байте, варианты расположения байт в слове, отличающиеся от расположения слов в двойном слове, про длину идентификаторов и вообще про всякое, но, блин, в двадцать-то первом веке ...

Сообщение было отредактировано: 13 апр 20, 06:28
13 апр 20, 06:26    [22115164]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
White Owl
По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char)


да, в К&R написано, что char может быть и signed. в этом случае числа попадают в отрезок от -127 до 127.
но когда мы объявлем переменную как просто char (без указания signed/unsigned) тут и возникают непонятки.

картинка
так же можно и с -10 аналогичное поведение увидеть, а так же в переменную можно долбануть 130 , что тоже прокатит. так sined или unsigned ???



White Owl

Во вторых, если почитать конкретно документацию на getchar() то мы увидим:

fgetc(), getc() and getchar() return the character read as an unsigned
char cast to an int or EOF on end of file or error.

правильно вот и написано, что возвращенное значение это или символ (причем unsigned char, см. описание выше) или eof или ошибка. то есть eof не относят к символам всё же. это скорее состояние. ассоциировать его с символом я считаю неправильным.
хотя физически и можно так как читать ниже

White Owl

Ну и никто же не запрещает сделать:
printf("%d %i %c\n", EOF, EOF, EOF);
И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1.



да это буква "я" см. и моя картинка так же это подтверждает, но почему это так вне моего понимания.

Сообщение было отредактировано: 13 апр 20, 11:03
13 апр 20, 10:58    [22115236]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

andron81
почему это так вне моего понимания.

Значит, как уже сказали, начинай изучать основы функционирования компьютера. Биты, байты,
кодировки символов и прочий ассемблер. В общем, школьный курс информатики.

Posted via ActualForum NNTP Server 1.5

13 апр 20, 12:24    [22115305]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
andron81
но почему это так вне моего понимания.
Потому, что дополнительный код:
-x == ~x + 1)
13 апр 20, 12:28    [22115309]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
Basil A. Sidorov
man getchar
указал какая у меня операционка (c) andron81. Педантизм - он в обе стороны работает. Если так упирать на индивидуальные различия разных реализаций, то нехорошо ссылаться на совсем другую документацию.
Хотя ...
Вот-вот... "хотя". Гугл прекрасно находит страницы man и разница в описании функций только в том какие функции считаются родственными.

Basil A. Sidorov
Есть, конечно, у меня справочник по Це тысяча девятьсот семьдесят шестого, что ли, года издания. Девять бит в байте, варианты расположения байт в слове, отличающиеся от расположения слов в двойном слове, про длину идентификаторов и вообще про всякое, но, блин, в двадцать-то первом веке ...
При чем здесь Си и двадцать первый век? Это схемотехника не зависящая от языка и эпохи. Берешь например семейство процессоров ARM которые так любит Nintendo и читаешь документацию - слово размером в четыре байта и вперед. Никого не колышет что ты пришел из мелкомягкого мира который приучил к двубайтным словам и даже к двойным словам.



andron81
да, в К&R написано, что char может быть и signed. в этом случае числа попадают в отрезок от -127 до 127.
но когда мы объявлем переменную как просто char (без указания signed/unsigned) тут и возникают непонятки.
signed.
Если для переменной целого типа не указано signed она или unsigned - она всегда signed.
Это тоже стандарт со времен K&R.

andron81
правильно вот и написано, что возвращенное значение это или символ (причем unsigned char, см. описание выше) или eof или ошибка. то есть eof не относят к символам всё же. это скорее состояние. ассоциировать его с символом я считаю неправильным.
Не "eof или ошибка" а "eof если ошибка". Читай внимательнее.
13 апр 20, 16:33    [22115503]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Топик превратился в Кэролловскую "Охоту на Снарка".
13 апр 20, 16:42    [22115509]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
andron81
правильно вот и написано, что возвращенное значение это или символ (причем unsigned char, см. описание выше) или eof или ошибка. то есть eof не относят к символам всё же. это скорее состояние. ассоциировать его с символом я считаю неправильным.
Не "eof или ошибка" а "eof если ошибка". Читай внимательнее.[/quot]

RETURN VALUE
fgetc(), getc() and getchar() return the character read as an unsigned
char cast to an int or EOF on end of file or error.

ну я бы всё же перевел это иначе: или unsigned char преобразованное в целое (а это число от 0 до 255)
или eof или ошибка .
13 апр 20, 16:57    [22115517]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

White Owl
signed.
Если для переменной целого типа не указано signed она или unsigned - она всегда signed.

За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char
тремя отдельными типами. И если диагностику компилятора немного прикрутить, то он начнёт
ругаться на неявные преобразования между ними.

Posted via ActualForum NNTP Server 1.5

13 апр 20, 17:47    [22115540]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
White Owl
Ctrl+z это такая же буква как и все остальные буквы алфавита. Она может быть внутри потока байт который ты читаешь из файла или с клавиатуры. Это просто традиция овеянная веками - считать ее за EOF.
*facepalm*
13 апр 20, 19:01    [22115584]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
Dimitry Sibiryakov
За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char
тремя отдельными типами.
Со времён C89 char, signed char, unsigned char это 3 разных типа.
13 апр 20, 19:05    [22115591]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
mayton
Member

Откуда: loopback
Сообщений: 46320
Давайте для чистоты эксперимента соберем две сборки. Вод Винду и Линукс и посмотри какая буква ЁП... туда лезет.

Есть у меня предположение что может быть разный эффект.

P.S. "Вот место для поисков Снарка"
13 апр 20, 19:16    [22115595]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
White Owl
И поэтому от прямого использования EOF уже давно отказались.
*facepalm*
White Owl
Твой оригинальный код должен был выглядеть так:

#include <stdio.h> 
int main()
{    
    int c;

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

Потому что getchar() вернет ноль (оно же false) как в случае реального окончания файла, так и в случае нахождения строки с единственным символом EOF.
Ты свой несусветный бред пробовал хотя бы раз сверять с реальностью? https://wandbox.org/permlink/Rzm67FQ6Prn59Z9U
13 апр 20, 19:20    [22115603]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dima T
Member

Откуда:
Сообщений: 14727
a guest
White Owl
И поэтому от прямого использования EOF уже давно отказались.
*facepalm*
White Owl
Твой оригинальный код должен был выглядеть так:

#include <stdio.h> 
int main()
{    
    int c;

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

Потому что getchar() вернет ноль (оно же false) как в случае реального окончания файла, так и в случае нахождения строки с единственным символом EOF.
Ты свой несусветный бред пробовал хотя бы раз сверять с реальностью? https://wandbox.org/permlink/Rzm67FQ6Prn59Z9U

Это пример из культового учебника по С. ТС (и автор) не виноват что спустя много лет он не компилируется.
13 апр 20, 20:37    [22115644]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 834
Dima T
a guest
пропущено...
*facepalm*
пропущено...
Ты свой несусветный бред пробовал хотя бы раз сверять с реальностью? https://wandbox.org/permlink/Rzm67FQ6Prn59Z9U

Это пример из культового учебника по С. ТС (и автор) не виноват что спустя много лет он не компилируется.


Из какого ? если вы имеете ввиду K&R , то там таких примеров нет. там все примеры с завершением цикла по eof
13 апр 20, 20:53    [22115645]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
Dima T
ТС (и автор) не виноват что спустя много лет он не компилируется.
У ТС с кодом всё ок. И при чём тут "не компилируется"?
13 апр 20, 21:09    [22115648]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
Более корректно было бы сказать "не совпадающее ни с одним возможным значением unsigned char".
13 апр 20, 21:38    [22115658]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
mini.weblab
Member

Откуда:
Сообщений: 795
#include <stdio.h>
#define EOF -101

int main() {
    char c;
    for(c=0; c != EOF; c++);
    printf("%d: %c\n", c, c);
}
13 апр 20, 22:06    [22115667]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
Dimitry Sibiryakov

Barlone
getchar() возвращает int, не char.

Вообще-то по-жизни (то есть изначально) она возвращала именно char.
Изначально — это какой год?
Dimitry Sibiryakov
В int её перековали относительно недавно, когда внезапно обнаружилась буква "я" в кодировке Windows-1251.
getchar возвращает int уже в первом издании K&R C, в 1978 году. Где 1978 и где Windows-1251. Ты из дурки вещаешь, что ли?
13 апр 20, 23:03    [22115687]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

a guest
getchar возвращает int уже в первом издании K&R C, в 1978 году.

Ах, вот оно как. Ну, значит, я ошибался.

Posted via ActualForum NNTP Server 1.5

14 апр 20, 00:46    [22115719]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
White Owl
Берешь например семейство процессоров ARM
Понял.
Если я достиг вершин мастерства в своей области, то об этом надо сообщить всем. Даже тем, кому до этого мастерства ещё пилить и пилить, да и область у них совершенно другая. Ну, что ж - тоже вариант ...

P.S.
Нахрена топикстартеру знать про ARM, если для него signed/unsigned - тёмный лес?
14 апр 20, 05:40    [22115744]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
a guest
Member

Откуда:
Сообщений: 255
Basil A. Sidorov
Нет в Це байтов
http://port70.net/~nsz/c/c11/n1570.html#3.6p1
byte
addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
14 апр 20, 07:32    [22115755]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
a guest
http://port70.net/~nsz/c/c11/n1570.html#3.6p1
byte
Какая связь между определением "минимально адресуемая область памяти" и "тип языка программирования"?
14 апр 20, 10:13    [22115811]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
White Owl
Member

Откуда:
Сообщений: 12501
Basil A. Sidorov
a guest
пропущено...
Какая связь между определением "минимально адресуемая область памяти" и "тип языка программирования"?

K&R pp12-13
C provides several other data types besides int and float, including:
charcharacter - a single byte
shortshort integer
longlong integer
doubledouble-precision floating point

The size of these objects is also machine-dependent.
14 апр 20, 15:21    [22116030]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10141
White Owl
K&R pp12-13
Повторю для особо непонятливых - речь шла об имени типа, а не о том, чему он соответствует.
Считаете, что формулировка была неудачной - можно обсудить отдельно.
14 апр 20, 16:01    [22116060]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Barlone
Member

Откуда:
Сообщений: 1389
White Owl
andron81
пропущено...


Почему так уж разразились критикой?
Можете прокомментировать?
Ну начать можно с того, что int и char это практически одно и то-же, отличающееся всего-лишь размером. Причем только возможно отличающиеся. По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char)
Поэтому заявлять что "getchar() возвращает int, не char." и делать из этого выводы не особо полезно.

Во вторых, если почитать конкретно документацию на getchar() то мы увидим:
man getchar
RETURN VALUE
fgetc(), getc() and getchar() return the character read as an unsigned
char cast to an int or EOF on end of file or error.


"И EOF - это целое число, не совпадающее ни с одним возможным значение char."
Угу... открываем stdlib.h и видим там строку:
#define EOF (-1)
Это очень сильно не совпадает с возможными значениями char.... Ага, ага.
Ну и никто же не запрещает сделать:
printf("%d %i %c\n", EOF, EOF, EOF);
И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1.


Вообще, когда пишешь на Си, очень полезно понимать как работает компьютер. Если для вас язык это что-то такое волшебное и мистическое - успеха не будет совсем. Для С++ это тоже будет полезным, но в меньшей степени. И чем более "высокий" язык, тем допустимая степень волшебности выше, для успешного написания программы.
Ну то, что каст EOF к char дает какой-то символ совсем неудивительно. Сколько бы ни было возможных значений int, кастуя из в char, мы всегда получим один из 256 символов. А вот в обратную сторону... Сами же цитируете "return the character read as an unsigned char cast to an int" и это легко проверяется - символ возвращается как 255, а EOF -1
А что sizeof(int) >= sizeof(char) - ну равенство там скорее гипотетическое. Разве что в каком-нибудь суровом embedded с четырехбитным процессором и 128 байтами озу... Но там и со стандартной библиотекой плохо будет.

Сообщение было отредактировано: 16 апр 20, 21:08
16 апр 20, 21:01    [22117764]     Ответить | Цитировать Сообщить модератору
 Re: как все же отловить eof  [new]
Barlone
Member

Откуда:
Сообщений: 1389
#include <stdio.h> 
int main()
{
    int c;
    do {
        c = getchar();
        printf("%d ", c);
    } while (c  != EOF);
    return 0;
}
Компилируем, подсовываем через перенаправление "<" на вход файл c той самой буквой 'я' и видим, что буква=255, а EOF=-1

Сообщение было отредактировано: 16 апр 20, 21:21
16 апр 20, 21:21    [22117773]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / C++ Ответить