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

Откуда:
Сообщений: 820
#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

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

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

Откуда:
Сообщений: 10171
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

Откуда:
Сообщений: 10171
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

Откуда:
Сообщений: 10171
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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / C++ Ответить