Рейтинговые книги
Читем онлайн Освой самостоятельно С++ за 21 день. - Джесс Либерти

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 104 105 106 107 108 109 110 111 112 ... 170

• Объект cin (произносится как "си-ин" от английского "see-in") обрабатывает ввод с клавиатуры.

• Объект cout (произносится как "си-аут" от английского "see-out") обрабатывает вывод на экран.

• Объект cerr (произносится как "си-эр" от английского "see-err") обрабатывает не буферизированный вывод ошибок на стандартное устройство вывода сообщений об ошибках, т.е. на экран. Поскольку вывод не буферизированный, то все данные, направляемые в c err, сразу же выводятся устройством вывода.

• Объект clog (произносится как "си-лог" от английского "see-log") обрабатывает буферизированные сообщения об ошибках, которые выводятся на стандартное устройство вывода сообщений об ошибках (экран). Зачастую эти сообщения переадресуются в файл регистрации. Об этом вы узнаете далее в главе.

Переадресация

Каждое стандартное устройство ввода и вывода, в том числе устройство вывода сообщений об ошибках, может осуществлять переадресацию на другие устройства. Например, системные сообщения об ошибках часто переадресуются в файл регистрации. Для ввода и вывода данных программой также можно использовать файлы, для чего служат специальные команды операционной системы.

Под переадресацией понимают пересылку выводимых данных в устройство, либо считывание данных с устройства, отличное от установленного по умолчанию. В операционных системах DOS и UNIX используются специальные операторы переадресации ввода (<) и вывода (>).

Пайпингом называется использование вывода одной программы в качестве ввода для другой.

Операционная система DOS содержит ограниченный набор команд переадресации для вывода (>) и ввода (<). Команды переадресации системы UNIX более разнообразны, однако основная идея остается той же: данные выводятся на экран, записываются в файл или передаются другой программе. Ввод в программу осуществляется из файлов или с клавиатуры.

В целом переадресация больше относится к функциям операционной системы, а не библиотек iosream. Язык C++ предоставляет доступ к четырем стандартным устройствам и необходимый набор команд для переадресации устройств ввода-вывода.

Вывод данных с помощью cin

Глобальный объект cin отвечает за ввод данных и становится доступным при включении в программу класса iostream. В предыдущих примерах используется перегруженный оператор ввода (>>) для присвоения вводимых данных переменным программы. Для ввода данных используется следующий синтаксис".

int someVariable;

cout << "Enter а number: ";

cin >> someVariable;

Другой глобальный объект, cout, и его использование для вывода данных обсуждается несколько ниже. Сейчас же остановимся на третьей строке: cin >> someVariable;. Что же представляет собой объект cin?

На глобальность этого объекта указывает тот факт, что его не нужно объявлять в коде программы. Объект cin включает перегруженный оператор ввода (>>), который записывает данные, хранимые в буфере cin, в локальную переменную someVariable. Причем оператор ввода перегружен таким образом, что подходит для ввода данных всех базовых типов, включая int&, short&, long&, double&, float&, char&, char* и т.п. Когда компилятор встречает выражение cin >> someVariable, то вызывается вариант оператора ввода, соответствующий типу переменной someVariable. В приведенным выше примере someVariable имеет тип int, поэтому вызывается следующий вариант перегруженной функции:

istream & operator>> (int&)

Обратите внимание, поскольку параметр передается как ссылка, оператор ввода может изменять исходную переменную. Использование cin показано в листинге 16.1.

Листинг 16.1. Использование cin для ввода данных разных типов

1: //Листинг 16.1. Ввод даннах с помощью cin

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    int myInt;

8:    long myLong;

9:    double myDouble;

10:   float myFloat;

11:   unsigned int myUnsigned;

12:

13:   cout << "int: ";

14:   cin >> myInt;

15:   cout << "Long: ";

16:   cin >> myLong;

17:   cout << "Double: ";

18:   cin >> myDouble;

19:   cout << "Float: ";

20:   cin >> myFloat;

21:   cout << "Unsigned: ";

22:   cin >> myUnsigned; 23:

24:   cout << "nnInt:t" << myInt << endl;

25:   cout << "Long:t" << myLong << endl;

26:   cout << "Double:t" << myDouble << endl;

27:   cout << "Float:t" << myFloat << endl;

28:   cout << "Unsigned:t" <<myUnsigned << endl;

29:   return 0;

30: }

Результат:

int: 2

Long: 70000

Double: 987654321

Float: 3.33

Unsigned: 25

Int: 2

Long: 70000

Double: 9.87654e+08

Float: 3.33

Unsigned: 25

Анализ: В строках 7—11 объявляются переменные разных типов. В строках 13—22 пользователю предлагается ввести значения для этих переменных, после чего результаты выводятся в строках 24—28 (с помощью cin).

Выводимая программой информация говорит о том, что переменные записываются и выводятся в соответствии с их типом.

Строки

Объект cin также может принимать в качестве аргумента указатель на строку символов (char*), что позволяет создавать буфер символов и заполнять его с помощью cin. Например, можно написать следующее:

char YourName[50]

cout << "Enter your name: ";

cin >> YourName;

Если ввести имя Jesse, переменная YourName заполнится символами J, e, s, s, e и . Последним будет концевой нулевой символ, так как cin автоматически вставляет его. Поэтому при определении размера буфера нужно позаботиться о том, чтобы он был достаточно большим и мог вместить все символы строки, включая концевой нулевой символ. Более подробно о поддержке концевого нулевого символа стандартными библиотечными строковыми функциями речь пойдет на занятии 21.

Проблемы, возникающие при вводе строк

Успешно выполнив все описанные ранее операции с объектом cin, вы будете неприятно удивлены, если попытаетесь ввести в строке полное имя. Дело в том, что cin рассматривает пробел как заданный по умолчанию разделитель строк. После того как в строке обнаруживается пробел, ввод строки завершается добавлением концевого нулевого символа. Эта проблема показана в листинге 16.2.

Листинг 16.2. Попытка ввода бодев одного сша с помощьм cin  

1: //Листинг 16.2. Проблемы с вводом строки с помощью cin

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    char YourName[50];

8:    cout << "Your first name: ";

9:    cin >> YourName;

10:   cout << "Here it is: " << YourName << endl;

11:   cout << "Your entire name: ";

12:   cin >> YourName;

13:   cout << "Here it is: " << YourName << endl;

14:   return 0;

15: }

Результат:

Your first name: Jesse

Here it is: Jesse

Your entire name: Jesse Liberty

Here it is: Jesse

Анализ: Строкой 7 для хранения вводимой пользователем строки создается массив символов. В строке 8 пользователю предлагается ввести имя, и, как видно из вывода, это имя сохраняется правильно.

В строке 11 пользователю предлагается ввести не только имя, но и фамилию. Ввод осуществляется только до тех пор, пока cin не обнаружит пробел между именем и фамилией. После этого ввод строки прекращается и оставшаяся информация теряется. Это не совсем то, что было нужно.

Чтобы понять, почему cin работает именно так, проанализируйте листинг 16.3, в котором показан пример ввода строки значений.

Листинг 16.3. Ввод строки значений

1: //Листинг 16.3. Ввод строки значений с помощью cin

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    int myInt;

8:    long myLong;

9:    double myDouble;

10:   float myFloat;

11:   unsigned int myUnsigned;

12:   char myWord[50];

13:

14:   cout << "int: ";

15:   cin >> myInt;

16:   cout << "Long: ";

17:   cin >> myLong;

18:   cout << "Double: ";

19:   cin >> myDouble;

20:   cout << "Float: ";

21:   cin >> myFloat;

22:   cout << "Word: ";

23:   cin >> myWord;

24:   cout << "Unsigned: ";

25:   cin >> myUnsigned;

26:

27:   cout << "nnInt:t" << myInt << endl;

28:   cout << "Long:t" << myLong << endl;

29:   cout << "Double:t" << myDouble << endl;

30:   cout << "Float:t" << myFloat << endl;

31:   cout << "Word: t" << myWord << endl;

32:   cout << "Unsigned:t" << myUnsigned << endl;

33:

34:   cout << "nnInt, Long, Double, Float, Word, Unsigned: ";

35:   cin >> myInt >> myLong >> myDouble;

36:   cin >> myFloat >> myWord >> myUnsigned;

37:   cout << "nnInt:t" << myInt << endl;

38:   cout << "Long:t" << myLong << endl;

39:   cout << "Double:t" << myDouble << endl;

40:   cout << "Float:t" << myFloat << endl;

41:   cout << "Word: t" << myWord << endl;

42:   cout << "Unsigned:t" << myUnsigned << endl;

43:

44:

45:   return 0;

46: }

Результат:

Int: 2

Long: 30303

Double: 393939397834

Float: 3.33

Word: Hello

Unsigned: 85

Int: 2

Long: 30303

1 ... 104 105 106 107 108 109 110 111 112 ... 170
На этой странице вы можете бесплатно читать книгу Освой самостоятельно С++ за 21 день. - Джесс Либерти бесплатно.

Оставить комментарий