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

1 ... 304 305 306 [ 307 ] 308 309 310 ... 342


Другие темы 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, со-



Идентификатор

Назначение

va list

Тип, предназначенный для хранения информации, необходимой макросам va star1:, va arg и va end. Для обработки параметров из списка параметров переменной длины необходимо объявлять объект типа vajist.

va start

Этот макрос должен вызываться перед обработкой списка переменного числа параметров. Макрос инициализирует объект типа va list для последующего использования его макросами va arg и va end.

va arg

Макрос, расширяющийся до выражения, которое имеет тип и значение следующего параметра в списке параметров переменной длины. Каждый вызов va arg изменяет значение объекта типа vajist таким образом, что он ссылается на следующий по списку параметр.

va end

Макрос, который обеспечивает нормальное возвращение из функции, в которой для обработки списка параметров переменной длины использовался макрос va start.

Рис. 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;



1 ... 304 305 306 [ 307 ] 308 309 310 ... 342

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