powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как все же отловить eof
25 сообщений из 63, страница 2 из 3
как все же отловить eof
    #39946401
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вообще-то по-жизни (то есть изначально) она возвращала именно char.
То, что у буржуев по жизни был signed char сильно раздражало не только советских
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946402
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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


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

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


описан в stdio как -1
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946405
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Dimitry Sibiryakov
Вообще-то по-жизни (то есть изначально) она возвращала именно char.
То, что у буржуев по жизни был signed char сильно раздражало не только советских


а вот оно что... сигнет чар
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946407
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
тогда интересно как в таком случае эта функция выдавала состояне eof
Неточная цитата из книги "Всё про TeX":
"Были рассмотрены и другие варианты кодировок, но необходимость использования более 128 кодов в общеупотребительных приложениях всё ещё неочевидна".
Высказывание принадлежит американскому национальному комитету стандартизации и сделано оно было в 1963 году.а байт отрицательное число не выдастНет в Це байтов - только char. И он, внезапно, может быть знаковым.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946410
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov

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


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

как я понимаю signed char это уже не байт. может это байт + 1 бит(фантазирую)? Но это тоже уже не байт )))))). но последнее я нигде не встречал, я думал, что всё это должно быть кратно 8.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946444
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А надо не фантазировать а читать учебники и заголовочные файлы.
char он всегда равен байту - это из учебника и стандарта языка.
signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII.
unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы.
И да, байт не всегда восьмибитный, но размер char всегда в один байт.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946445
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
Это такая несусветная глупость что просто "ОЙ".
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946450
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
А надо не фантазировать а читать учебники и заголовочные файлы.
char он всегда равен байту - это из учебника и стандарта языка.
signed char - старший бит байта отдан под знак, остальные под код символа. Итого, на восмибитном байте - 1 бит под знак и 7 под букву - 128 букв, стандартный ASCII.
unsigned char - все биты байт отданы под код символа. 256 букв - расширенный ASCII, оно же всяческие однобайтовые кодовые страницы.
И да, байт не всегда восьмибитный, но размер char всегда в один байт.


Для этого книги надо эти иметь. И дойти. У меня только керриган, ритчи. Для меня например новость, что байт может быть не восьмибитным. Это просто революция какая-то
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946456
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Barlone
getchar() возвращает int, не char. И EOF - это целое число, не совпадающее ни с одним возможным значение char.
Это такая несусветная глупость что просто "ОЙ".


Почему так уж разразились критикой?
Можете прокомментировать?
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946470
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
White Owl
пропущено...
Это такая несусветная глупость что просто "ОЙ".


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

Это очень сильно не совпадает с возможными значениями char.... Ага, ага.
Ну и никто же не запрещает сделать:
Код: plaintext
1.
printf("%d %i %c\n", EOF, EOF, EOF);

И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1.


Вообще, когда пишешь на Си, очень полезно понимать как работает компьютер. Если для вас язык это что-то такое волшебное и мистическое - успеха не будет совсем. Для С++ это тоже будет полезным, но в меньшей степени. И чем более "высокий" язык, тем допустимая степень волшебности выше, для успешного написания программы.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946481
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Ну начать можно с того, что int и char это практически одно и то-же, отличающееся всего-лишь размером. Причем только возможно отличающиеся. По стандарту (и это есть в K&R) и то и другое это целые числа при этом количество байт отданных под int больше или равно количеству байт отданных под char. sizeof(int) >= sizeof(char)
Педантизм, конечно, хорошо, но учёт давно уже старых реалий - ещё лучше.man getchar указал какая у меня операционка (c) andron81. Педантизм - он в обе стороны работает. Если так упирать на индивидуальные различия разных реализаций, то нехорошо ссылаться на совсем другую документацию.
Хотя ...

P.S.
Есть, конечно, у меня справочник по Це тысяча девятьсот семьдесят шестого, что ли, года издания. Девять бит в байте, варианты расположения байт в слове, отличающиеся от расположения слов в двойном слове, про длину идентификаторов и вообще про всякое, но, блин, в двадцать-то первом веке ...
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946531
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
printf("%d %i %c\n", EOF, EOF, EOF);

И да, если у тебя консоль работает в CP1251, то %c ты получишь букву "я" (строчная 33-я буква кириллицы). Потому что CP1251 ее код 255, что в случае однобайтного целого так-же кодирует и -1.



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

Значит, как уже сказали, начинай изучать основы функционирования компьютера. Биты, байты,
кодировки символов и прочий ассемблер. В общем, школьный курс информатики.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946574
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
но почему это так вне моего понимания.
Потому, что дополнительный код:
Код: plaintext
1.
-x == ~x + 1)
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946667
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 если ошибка". Читай внимательнее.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946672
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик превратился в Кэролловскую "Охоту на Снарка".
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946677
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 или ошибка .
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946689
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlsigned.
Если для переменной целого типа не указано signed она или unsigned - она всегда signed.

За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char
тремя отдельными типами. И если диагностику компилятора немного прикрутить, то он начнёт
ругаться на неявные преобразования между ними.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946724
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Ctrl+z это такая же буква как и все остальные буквы алфавита. Она может быть внутри потока байт который ты читаешь из файла или с клавиатуры. Это просто традиция овеянная веками - считать ее за EOF.
*facepalm*
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946727
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
За Си не скажу, но тот, что с плюсами, нынче считает char, signed char и unsigned char
тремя отдельными типами.
Со времён C89 char, signed char, unsigned char это 3 разных типа.
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946730
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте для чистоты эксперимента соберем две сборки. Вод Винду и Линукс и посмотри какая буква ЁП... туда лезет.

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

P.S. "Вот место для поисков Снарка"
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946737
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
И поэтому от прямого использования EOF уже давно отказались.
*facepalm*
White Owl
Твой оригинальный код должен был выглядеть так:

Код: 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.
Ты свой несусветный бред пробовал хотя бы раз сверять с реальностью? https://wandbox.org/permlink/Rzm67FQ6Prn59Z9U
...
Рейтинг: 0 / 0
как все же отловить eof
    #39946762
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest
White Owl
И поэтому от прямого использования EOF уже давно отказались.
*facepalm*
White Owl
Твой оригинальный код должен был выглядеть так:

Код: 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.
Ты свой несусветный бред пробовал хотя бы раз сверять с реальностью? https://wandbox.org/permlink/Rzm67FQ6Prn59Z9U

Это пример из культового учебника по С. ТС (и автор) не виноват что спустя много лет он не компилируется.
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / как все же отловить eof
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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