|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Вообще-то по-жизни (то есть изначально) она возвращала именно char. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:15 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Barlonegetchar() возвращает int, не char. Вообще-то по-жизни (то есть изначально) она возвращала именно char. В int её перековали относительно недавно, когда внезапно обнаружилась буква "я" в кодировке Windows-1251. тогда интересно как в таком случае эта функция выдавала состояне eof , ведь все 255 символов задействованы, а байт отрицательное число не выдаст ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:16 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81а возможно сам eof может быть описан другой константой. описан в stdio как -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:17 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Dimitry Sibiryakov Вообще-то по-жизни (то есть изначально) она возвращала именно char. а вот оно что... сигнет чар ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:18 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81 тогда интересно как в таком случае эта функция выдавала состояне eof "Были рассмотрены и другие варианты кодировок, но необходимость использования более 128 кодов в общеупотребительных приложениях всё ещё неочевидна". Высказывание принадлежит американскому национальному комитету стандартизации и сделано оно было в 1963 году.а байт отрицательное число не выдастНет в Це байтов - только char. И он, внезапно, может быть знаковым. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:21 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Це байтов - только char. И он, внезапно, может быть знаковым. что это вы написали ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:30 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81, как я понимаю signed char это уже не байт. может это байт + 1 бит(фантазирую)? Но это тоже уже не байт )))))). но последнее я нигде не встречал, я думал, что всё это должно быть кратно 8. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 20:35 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
А надо не фантазировать а читать учебники и заголовочные файлы. char он всегда равен байту - это из учебника и стандарта языка. signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII. unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы. И да, байт не всегда восьмибитный, но размер char всегда в один байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 22:50 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Barlone getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 22:52 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owl А надо не фантазировать а читать учебники и заголовочные файлы. char он всегда равен байту - это из учебника и стандарта языка. signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII. unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы. И да, байт не всегда восьмибитный, но размер char всегда в один байт. Для этого книги надо эти иметь. И дойти. У меня только керриган, ритчи. Для меня например новость, что байт может быть не восьмибитным. Это просто революция какая-то ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 23:22 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owl Barlone getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char. Почему так уж разразились критикой? Можете прокомментировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2020, 23:47 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81 White Owl пропущено... Это такая несусветная глупость что просто "ОЙ". Почему так уж разразились критикой? Можете прокомментировать? Поэтому заявлять что "getchar() возвращает int, не char." и делать из этого выводы не особо полезно. Во вторых, если почитать конкретно документацию на getchar() то мы увидим: man getcharRETURN 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 и видим там строку: Код: plaintext 1.
Это очень сильно не совпадает с возможными значениями char.... Ага, ага. Ну и никто же не запрещает сделать: Код: plaintext 1.
И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1. Вообще, когда пишешь на Си, очень полезно понимать как работает компьютер. Если для вас язык это что-то такое волшебное и мистическое - успеха не будет совсем. Для С++ это тоже будет полезным, но в меньшей степени. И чем более "высокий" язык, тем допустимая степень волшебности выше, для успешного написания программы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 02:03 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owl Ну начать можно с того, что int и char это практически одно и то-же, отличающееся всего-лишь размером. Причем только возможно отличающиеся. По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char) Хотя ... P.S. Есть, конечно, у меня справочник по Це тысяча девятьсот семьдесят шестого, что ли, года издания. Девять бит в байте, варианты расположения байт в слове, отличающиеся от расположения слов в двойном слове, про длину идентификаторов и вообще про всякое, но, блин, в двадцать-то первом веке ... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 06:26 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
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 Ну и никто же не запрещает сделать: Код: plaintext 1.
И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1. да это буква "я" см. и моя картинка так же это подтверждает, но почему это так вне моего понимания. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 10:58 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81почему это так вне моего понимания. Значит, как уже сказали, начинай изучать основы функционирования компьютера. Биты, байты, кодировки символов и прочий ассемблер. В общем, школьный курс информатики. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 12:24 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81 но почему это так вне моего понимания. Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 12:28 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Basil A. Sidorov man getchar Хотя ... Вот-вот... "хотя". Гугл прекрасно находит страницы man и разница в описании функций только в том какие функции считаются родственными. Basil A. Sidorov Есть, конечно, у меня справочник по Це тысяча девятьсот семьдесят шестого, что ли, года издания. Девять бит в байте, варианты расположения байт в слове, отличающиеся от расположения слов в двойном слове, про длину идентификаторов и вообще про всякое, но, блин, в двадцать-то первом веке ... andron81 да, в К&R написано, что char может быть и signed. в этом случае числа попадают в отрезок от -127 до 127. но когда мы объявлем переменную как просто char (без указания signed/unsigned) тут и возникают непонятки. Если для переменной целого типа не указано signed она или unsigned - она всегда signed. Это тоже стандарт со времен K&R. andron81 правильно вот и написано, что возвращенное значение это или символ (причем unsigned char, см. описание выше) или eof или ошибка. то есть eof не относят к символам всё же. это скорее состояние. ассоциировать его с символом я считаю неправильным. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 16:33 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Топик превратился в Кэролловскую "Охоту на Снарка". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 16:42 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
andron81 правильно вот и написано, что возвращенное значение это или символ (причем unsigned char, см. описание выше) или eof или ошибка. то есть eof не относят к символам всё же. это скорее состояние. ассоциировать его с символом я считаю неправильным. 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.04.2020, 16:57 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owlsigned. Если для переменной целого типа не указано signed она или unsigned - она всегда signed. За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char тремя отдельными типами. И если диагностику компилятора немного прикрутить, то он начнёт ругаться на неявные преобразования между ними. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 17:47 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owl Ctrl+z это такая же буква как и все остальные буквы алфавита. Она может быть внутри потока байт который ты читаешь из файла или с клавиатуры. Это просто традиция овеянная веками - считать ее за EOF. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 19:01 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char тремя отдельными типами. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 19:05 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
Давайте для чистоты эксперимента соберем две сборки. Вод Винду и Линукс и посмотри какая буква ЁП... туда лезет. Есть у меня предположение что может быть разный эффект. P.S. "Вот место для поисков Снарка" ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 19:16 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
White Owl И поэтому от прямого использования EOF уже давно отказались. White Owl Твой оригинальный код должен был выглядеть так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Потому что getchar() вернет ноль (оно же false) как в случае реального окончания файла, так и в случае нахождения строки с единственным символом EOF. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 19:20 |
|
как все же отловить eof
|
|||
---|---|---|---|
#18+
a guest White Owl И поэтому от прямого использования EOF уже давно отказались. White Owl Твой оригинальный код должен был выглядеть так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Потому что getchar() вернет ноль (оно же false) как в случае реального окончания файла, так и в случае нахождения строки с единственным символом EOF. Это пример из культового учебника по С. ТС (и автор) не виноват что спустя много лет он не компилируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2020, 20:37 |
|
|
start [/forum/topic.php?fid=57&msg=39946531&tid=2017453]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 282ms |
total: | 441ms |
0 / 0 |