|
Программирование >> Структурное программирование
Другие темы 921 18.2. Переназначение ввода-вывода в системах UNIX и DOS Обычно ввод данных в программу производится с клавиатуры (стандартный ввод), а вывод из программы направляется на экран монитора (стандартный вывод). Во многих операционных системах, в частности, в UNIX и DOS, имеется возможность переназначить (переадресовать) ввод на ввод из файла, а вывод - на вывод в файл. Обе формы переназначения выполняются без использования процедур обработки файлов стандартной библиотеки. Имеется несколько способов переназначения ввода-вывода в командной строке UNIX. Рассмотрим программу sum, которая принимает вводимые по одному целые числа и суммирует введенные значения; это продолжается до тех пор, пока программа не получит сигнал об окончании файла, после чего она выводит значение суммы. Обычно пользователь вводит целые числа с клавиатуры и заканчивает ввод нажатием комбинации клавиш конец файла . Используя переназначение ввода, данные можно ввести из файла. Например, если данные находятся в файле input, то следующая командная строка $ sum < input вызовет на исполнение программу sum, а знак переназначения ввода (<) укажет программе, что данные для ввода находятся в файле input, а не будут вводиться с клавиатуры. Переназначение ввода в операционной системе DOS выполняется точно так же. Обратите внимание, что символ $ - это подсказка командной строки в UNIX (некоторые системы UNIX используют в качестве символа подсказки символ %). Студенты часто путаются и не понимают, что переназначение является возможностью операционной системы, а не очередной особенностью С++. Второй метод переназначения ввода - это конвейерная обработка. Знак конвейера () переадресует вывод одной программы на ввод другой программы. Предположим, что программа random выдает последовательность случайных целых чисел; вывод программы random может быть перенаправлен непосредственно в программу sum при помощи следующей командной строки UNIX $ random I sum В результате программа sum вычислит сумму целых чисел, которые вывела программа random. Конвейерная обработка может выполняться в UNIX и DOS. Вывод программы может быть переназначен в файл. Для этого используется знак переназначения вывода (>) (один и тот же знак используется и в UNIX, и в DOS). Например, чтобы переназначить вывод программы random в файл out, используйте строку $ random > out В заключение отметим, что вывод программы может быть добавлен в конец существующего файла, если воспользоваться знаком добавления вывода ( ) (один и тот же знак используется и в UNIX, и в DOS). Например, чтобы добавить вывод из программы random к содержимому файла out, со-
Рис. 18.1. Тип данных и макросы, определяемые в заголовочном файле stdarg.h Функция average использует все определения и макросы файла stdarg.h. В функции average объект ар типа va list используется макросами va start, va arg и va end для обработки списка параметров переменной длины. Функция начинает обработку с вызова va start для инициализации объекта ар, используемого далее макросами va arg и va end. В макрос va start передается два аргумента: объект ар и идентификатор самого правого параметра в списке параметров перед многоточием - в нашем примере это переменная i (va start использует i, чтобы определить начало списка аргументов переменной длины). Затем, функция average последовательно прибавляет к значению переменной total значения параметров из списка параметров переменной длины. Значение, которое будет добавлено к total, извлекается из списка параметров при помощи вызова макроса va arg. В макрос va arg передаются два аргумента: объект ар типа va list и тип следующего ожидаемого в списке параметров значения, в нашем случае - тип double. Макрос зданного в результате выполнения предыдущей командной строки, используйте командную строку $ random out 18.3. Список параметров переменной длины Можно создать функции, которые при вызове получают неопределенное число аргументов. Многоточие (...) в прототипе функции указывает на то, что функция имеет список параметров переменной длины и любого типа. Обратите внимание на то, что многоточие должно всегда находиться в конце списка параметров и по крайней мере один параметр должен быть задан по имени. Макросы и определения из заголовочного файла stdarg.h, посвященного спискам параметров переменной длины (см. рис. 18.1), обеспечивают возможности, необходимые при построении функций со списками параметров переменной длины. В программе на рис. 18.2 показан пример функции average, которая получает переменное число параметров. Первый параметр функции average - число значений, которые будут усредняться. *t. va start(ap, i); for (j = 1; j <= i; j++) total += va arg(ap, double); va end(ap); return total / i; w = 37.5 X = 22.5 7 2 = 10.2 T X = 22 *1 V - 1. Среднее значение w и x равно 30.ООО Среднее значение w, х и у равно 20.567 Среднее значение w, х, у и z ргтно 17.975 Рис. 18.2. Использование списка параметров переменной длины возвращает значение параметра. В завершение своей работы функция average вызывает макрос va end с объектом ар в качестве аргумента, который обеспечивает нормальное возвращение из average в функцию main. Полученное среднее значение возвращается функции main. Использование списка параметров переменной длины tinclude <iostream.h> iinclude <iomanip.h> tinclude <stdarg.h> double average(int, ...); main () double w = 37.5, x = 22.5, у = 1.7, z = 10.2; cout setiosflags(ios::fixed ios::showpoint) setprecision(1) w = w endl x = x endl y = у endl z = z endl; cout setiosflags(ios::fixed ios::showpoint) setprecision(3) endl Среднее значение w и x равно << average(2, w, x) endl Среднее значение w, x и у равно << average(3, w, x, y) << endl Среднее значение w, x, у и z равно average (4, w, x, y, z) endl; return 0; } double average(int i, ...) { double total = 0; int j ; va list ap;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |