Программирование >>  Структурное программирование 

1 ... 212 213 214 [ 215 ] 216 217 218 ... 342


Типичная ошибка программирования 11.1

Попытка прочитать данные из потока класса ostream (или из любого другого вы -ходного потока).

Типичная ошибка программирования 1.2

Попытка записать данные в поток класса istream (или в любой другой входной поток).

Типичная ошибка программирования 1.3

Отсутствие круглых скобок, устанавливающих последовательность выполнения one раций, при использовании операций с относительно высоким приоритетом вставить в поток и взять из потока .

Одним из наиболее распространенных способов последовательного ввода значенинь. является использование операции взять из потока в условии продолжения цикла структуры wMle. Операция взять из потока возвращает false (0), когда встречается признак конца файла. Рассмотрим программу на рис. 11.11, которая находит самую высокую оценку на экзамене. Пусть число оценок неизвестно и пользователь должен вводить признак конца файла для

Относительно высокий приоритет операций и может привести к возникновению проблем. Например, программа, приведенная на рис. 11.10, не может быть скомпилирована должным образом, если условное выражение не выделено с помощью круглых скобок. Читателю предоставляется возможность самому проверить это.

fig.ll 10.cpp

Демонстрация проблемы приоритета операций Необходимо заключать условное выражение в круглые скобки #include <iostream.h>

main() {

int X, у;

cout Введите два целых числа ; cin X у;

cout X (х == у ? : не ) равно у endl;

return 0;

Введите два целых числа 7 5

7 не равно 5

Введите два целых числа 8 8

8 равно 8

Рис. 11.10. Устранение проблем, связанных с приоритетами операции поместить в поток

и условной операции



того, чтобы показать, что все оценки уже введены. Условие продолжения цикла вида (cin grade) в структуре wMle, становится равным О (т.е. ложным), когда пользователь вводит признак конца файла.

figll ll.cpp

Операция взять из потока, возвращающая i ложь при вводе признака конца файла #include <iostream.h>

main{) (

int grade, highestGrade = -1;

cout Введите оценку (в конце введите признак конца файла): ; while (cin grade) {

if (grade > highestGrade) highestGrade = grade;

cout << Введите оценку (в конце введите признак конца файла): ;

cout << endl << Наивысшая оценка равна:

<< endl; return 0;

highestGrade

Введите

оценку

конце

введите

привнак

кошда

файла):

Введите

оценку

конце

введите

признак

конца

фгшла) :

Введите

оценку

конце

введите

признак

конца

файла):

Введите

оценку

конце

введите

признак

конца

файла):

Введите

оценку

конце

введите

признак

конца

файла):

Введите

оценку

конце

введите

признак

конца

файла):

Введите

оценку

конце

введите

признак

конца

файла):

Наивысшая оценка равна: 99

Рис. 11.11. Операция взять из потока, возвращающая ложь при вводе признака конца

файла

В программе на рис. 11.11 выражение cin grade может быть использовано в качестве условия, поскольку базовый класса ios (наследником которого является класс istream) обеспечивает перегруженную операцию приведения типа, которая преобразует поток в указатель типа void *. Значение указателя является нулевым, если произошла ошибка при попытке чтения значения или если был введен признак конца файла. Компилятор способен неявно использовать операцию приведения типа к void *.

11.4.2. Функции-элементы get и getline

Функция-элемент get без аргументов вводит одиночный символ из указанного потока (даже, если это символ разделитель) и возвращает этот символ в качестве значения вызова функции. Этот вариант функции get возвращает EOF, когда в потоке встречается признак конца файла.



Программа на рис. 11.12 демонстрирует использование функций-элементов eof и get для ввода из входного потока cin и использование функции-элемента put для вывода в выходной поток cout. Сначала программа печатает значение cin.eof( ), т.е. О (ложь), чтобы показать, что конец файла в cin не достигнут. Пользователь вводит строку текста, завершающуюся признаком конца файла (<ctrl>-z с последующим <return> в IBM-совместимых операционных система, <ctrl>-d - на компьютерах с ОС UNIX и Macintosh). Программа читает каждый символ и выводит его в cout, используя функцию-элемент print. Когда появляется признак конца файла, цикл while завершается и снова печатается значение cin.eof( ), равное теперь 1 (истина), чтобы показать, что в cin достигнут конец файла. Заметим, что программа использует вариант функции-элемента get класса istream, который не принимает никаких аргументов и возвращает введенный символ.

figll 12.cpp

Использование функций-элементов get, put и eof. #include <iostream.h>

main() {

int c;

cout До ввода cin.eofО равняется cin.eof() endl Введите предложение, завершающееся признаком конца файла: endl;

while { ( с = Cin.getO ) != EOF) cout.put(с);

cout << endl EOF в этой системе равняется с << endl; cout После ввода cin.eof() равняется cin.eof()

endl; return 0; }

До ввода cin.eof() равняется 0

Введите предложение, эавершгиощееся признаком конца файла: Проверка функций-элементов get и putZ Проверка функций-элементов get и put EOF в этой системе равняется -1 После ввода cin.eof() равняется 1

Рис. 11.12. Использование функций-элементов get, put и eof

Другой вариант функции-элемента get с символьным аргументом вводит очередной символ из входного потока (даже, если это символ разделитель) и сохраняет его в символьном аргументе. Этот вариант функции get возвращает ложь, когда встречается признак конца файла; в остальных случаях этот вариант функции get возвращает ссылку на тот объект класса istream, для которого вызывалась функция-элемент get.

Третий вариант функции-элемента get принимает три параметра: символьный массив, максимальное число символов и ограничитель (по умолчанию значение \п). Этот вариант читает символы из входного потока до тех пор, пока не достигается число символов, на 1 меньше указанного макси-



1 ... 212 213 214 [ 215 ] 216 217 218 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика