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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
#1

EOF K&R - C++

31.08.2013, 02:09. Просмотров 431. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток. Изучаю Си по Дейтелам, а теперь попала в руки книга авторов языка. Интересно теперь будет параллельно по двум книгам вести своё обучение. Так вот о чём я, не могу понять вродеб-то простых вещей. Объясните пожалуйста.

Итак, сначала выясним число 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, опять три ответа. Что-то я не могу в этом ничего понять. Может я чего-то недопонимаю и делаю неправильно ? Объясните новичку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2013, 02:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос EOF K&R (C++):

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) - C++
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A { ...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? - C++
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& - C++
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Порядок вычисления: операторы «|» и «||», «&» и «&&» - C++
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...

Friend ostream& operator<<(ostream& stream, CArr& obj); - C++
CArr.h #pragma once class CArr{ int* arr = nullptr; int size = 10; void swap(int *a, int *b); void swap(int &amp;a, int &amp;b); ...

8
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.08.2013, 02:19 #2
Цитата Сообщение от Kontaktnik Посмотреть сообщение
C++
1
while ((c = getchar() != EOF))
оу вы так хорошо изучаете, а кокой тут приоритет операций?
C++
1
while ((c = getchar()) != EOF)
Добавлено через 1 минуту
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Ввожу EOF, то бишь -1, опять три ответа
ввод минус еденици в консоль/файл никакого отношений к EOF не имееет
1
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 02:26 #3
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Ввожу EOF, то бишь -1
-1 - это данные, а не EOF. Начни с этого. EOF это не символ.

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

Не по теме:

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

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

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

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

#include <stdio.h>

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

return 0;
}

EOF is -1

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

PS. Кстати, извините что в тему плюсов написал, перепутал слегка
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.08.2013, 03:06 #7
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Почему -1 ?
Ну, например, потому что нет символа с таким кодом, а конец потока функции обозначать нужно.
В конце концов... http://ru.wikipedia.org/wiki/EOF
2
Kontaktnik
2 / 2 / 2
Регистрация: 22.08.2012
Сообщений: 24
31.08.2013, 03:10  [ТС] #8
Да здесь не в "конце концов", а в "начале начал". Спасибо более-менее понятно
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
31.08.2013, 12:03 #9
Цитата Сообщение от Kontaktnik Посмотреть сообщение
Стало понятно, что EOF это не символ. Тогда как объяснить константу в виде -1 ? Типа 0 или -1 == false ?
По стандарту EOF может раскрываться в любое отрицательное число, не обязательно -1. Писать программы, полагаясь, что EOF == -1, — неправильно.
0
31.08.2013, 12:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2013, 12:03
Привет! Вот еще темы с ответами:

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...

\n \0 EOF - C++
Добрый вечер, возник такой вопрос: зачем мы заменяем символ конца строки на нуль символ в данном коде (удаление символов содержащихся в s2...

Не работает while (!***.eof() ! - C++
Здравствуйте, задание такое: Вводить с клавиатуры данные и записывать их в файл в виде Имя группа оценка Иванов ...

Int Eof - C++
Вот проблема есть массив int a заполнять его целыми числами последовательность завершается признаком конца ввода


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru