Форум программистов, компьютерный форум CyberForum.ru

EOF K&R - C++

Восстановить пароль Регистрация
 
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
31.08.2013, 02:09     EOF K&R #1
Всем доброго времени суток. Изучаю Си по Дейтелам, а теперь попала в руки книга авторов языка. Интересно теперь будет параллельно по двум книгам вести своё обучение. Так вот о чём я, не могу понять вродеб-то простых вещей. Объясните пожалуйста.

Итак, сначала выясним число EOF, простите уж за мой нубский слэнг. Поехали:
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main()
{
   printf("EOF is %d\n", EOF);
 
   return 0;
}
Ответ: EOF is -1 // здесь всё понятно

Идём дальше:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
// подсчёт пробелов, табуляций и новых строк
main()
{
   int c, nb, nt, nl;
   nb = 0; // кол-во пробелов
   nt = 0; // кол-во табуляций
   nl = 0; // кол-во новых строк
 
   while ((c = getchar() != EOF)) {
      if (c == ' ')
         ++nb;
      if (c == '\t')
         ++nt;
      if (c == '\n')
         ++nl;
   }
 
   printf("%d%d%d\n", nb, nt, nl);
   return 0;
}
Вот в этой программе прямо-таки что хочешь делай, ничего не происходит.

wdfwefwec\n wdfwef
fwefwefew
wefwfwef-1
-1
-1
fwefwc // это мои "танцы" в консоле, до тех пор, пока не нажимаю ctrl+D(linux), затем нули:
000

Не задавая вопрос, ещё один пример:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
main()
{
   int c;
 
   while (c = getchar() != EOF)
      printf("%d\n", c);
   printf("%d - at EOF\n", c);
 
   return 0;
}
1
1
1
1
-1
1
1
1 // ctrl+D
0 - at EOF

Опять "танцы", пока не нажата комбинация ctrl+D. Ввожу еденицу, программа мне три в ответ. В цикле про три ответа ничего не говорится. Ввожу EOF, то бишь -1, опять три ответа. Что-то я не могу в этом ничего понять. Может я чего-то недопонимаю и делаю неправильно ? Объясните новичку.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.08.2013, 02:19     EOF K&R #2
Цитата Сообщение от Kontaktnik Посмотреть сообщение
C++
1
while ((c = getchar() != EOF))
оу вы так хорошо изучаете, а кокой тут приоритет операций?
C++
1
while ((c = getchar()) != EOF)
Добавлено через 1 минуту
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Ввожу EOF, то бишь -1, опять три ответа
ввод минус еденици в консоль/файл никакого отношений к EOF не имееет
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 02:26     EOF K&R #3
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Ввожу EOF, то бишь -1
-1 - это данные, а не EOF. Начни с этого. EOF это не символ.

Добавлено через 55 секунд

Не по теме:

Jupiter, не увидел твою мессагу.

Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
31.08.2013, 02:38  [ТС]     EOF K&R #4
Цитата Сообщение от Jupiter Посмотреть сообщение
оу вы так хорошо изучаете, а кокой тут приоритет операций?
Код C++
1
while ((c = getchar()) != EOF)
Простите, здесь действительно не обратил внимание.

Разобрался, всем спасибо.

Стало понятно, что EOF это не символ. Тогда как объяснить константу в виде -1 ? Типа 0 или -1 == false ?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 02:56     EOF K&R #5
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Тогда как объяснить константу в виде -1
Что значит "объяснить константу"?
getchar считал введенные тобой символы в консоли: символ - и символ 1. Их коды не равны -1. Что здесь тебе не понятно?
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
31.08.2013, 03:02  [ТС]     EOF K&R #6
С этим всем я разобрался, понял что EOF это и есть Ctrl+D. Понимаю как считывает getchar. Это всё более-менее понятно. Но вот код :

#include <stdio.h>

int main()
{
printf("EOF is %d\n", EOF);

return 0;
}

EOF is -1

Это я имел ввиду за константу. Почему -1 ?

PS. Кстати, извините что в тему плюсов написал, перепутал слегка
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 03:06     EOF K&R #7
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Почему -1 ?
Ну, например, потому что нет символа с таким кодом, а конец потока функции обозначать нужно.
В конце концов... http://ru.wikipedia.org/wiki/EOF
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
31.08.2013, 03:10  [ТС]     EOF K&R #8
Да здесь не в "конце концов", а в "начале начал". Спасибо более-менее понятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2013, 12:03     EOF K&R
Еще ссылки по теме:

C++ \n \0 EOF
Friend ostream& operator<<(ostream& stream, CArr& obj); C++
C++ Функция fclose() и EOF

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.08.2013, 12:03     EOF K&R #9
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Стало понятно, что EOF это не символ. Тогда как объяснить константу в виде -1 ? Типа 0 или -1 == false ?
По стандарту EOF может раскрываться в любое отрицательное число, не обязательно -1. Писать программы, полагаясь, что EOF == -1, — неправильно.
Yandex
Объявления
31.08.2013, 12:03     EOF K&R
Ответ Создать тему
Опции темы

Текущее время: 17:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru