Перенаправление стандартного ввода и вывода на файл
Операционная система позволяет направить стандартный ввод на файл вместо клавиатуры, а стандартный вывод на файл вместо экрана. Для такого перенаправления ввода и вывода программу следует запустить из командной строки, в которой указать входной и выходной файлы. Как это сделать, разберем это на примере программы 13 о подсчете выручки.
Исходный файл программы 13 называется Receipt.cpp, а исполняемый файл – Receipt.exe. Программа ожидает ввода с клавиатуры и выводит результаты на экран. Подготовим файл с исходными данными для этой программы. Это можно сделать с помощью любого текстового редактора, например, встроенного текстового редактора системы разработки. В среде TC выполним команду File, New, будет создан новый пустой файл, в его окне введем следующие данные о продажах четырех товаров по трем магазинам в виде:
543.50 764.45 456.70 1003.50
604.17 710.33 550.20 1221.80
804.0 765 480.34 1100
Сохраним набранные данные в файле Dtreceip.cpp.
Запустим программу 13 командной строкой:
D:\AUser\Programs>Receipt.exe < Dtreceip.cpp
Программа прочитает входные данные из указанного файла Dtreceip.cpp, а результаты выведет на экран.
Чтобы перенаправить стандартный ввод на чтение из файла, а вывод направить не на экран, а в файл, следует запустить программу командной строкой:
D:\AUser\Programs>Receipt.exe < Dtreceip.cpp > Rez.txt
Здесь Rez.txt – имя файла, в который будет производиться вывод. Если выходной файл не существовал, он будет создан операционной системой.
Можно ввод производить со стандартного устройства (клавиатуры), а вывод осуществлять в файл, для этого следует использовать командную строку:
D:\AUser\Programs>Receipt.exe > Rez.txt
Содержимое файла Rez.txt можно вывести на экран командной строкой
D:\AUser\Programs>type Rez.txt
или открыть его в редакторе TC. В нем будет:
Введите выручку от чая, сахара, крупы, колбасы
Магазин 1: Магазин 2: Магазин 3: Выручка по магазинам:
2768.15
3086.5
3149.34
Выручка по товарам:
1951.67, 2239.78, 1487.24, 3325.3,
Всего продано за день на: 9003.99
Работая в Windows, можно запускать программы с перенаправлением ввода и вывода на файл, используя ярлык на Рабочем столе, рис.26, задавая на вкладке Программы окна Свойства ярлыка нужную командную строку. Имена входного Dtreceip.cpp и выходного result.txt файлов указаны кратко, они отыскиваются в Рабочей папке.
Рис.26. Свойства ярлыка для запуска программы
Через окно запуска программы, рис. 24, также можно сформировать командную строку, перенаправляющую ввод и вывод на файл, но требуется указывать полные имена всех файлов.
Доступ к командной строке имеется также у файловых менеджеров типа Far или Windows Commander.
Перенаправить на файл можно только стандартный ввод и вывод. Если в программе используется, например, функция getch, которая не относится к стандартному вводу, то программа, запущенная подобной командной строкой, работать не будет (зависает).
Аргументы командной строки
При запуске программы на выполнение функция main может получить из операционной среды два аргумента. Для доступа к ним main должна быть объявлена с двумя формальными аргументами в виде:
void main(int argc, char* argv[])
Первый аргумент argc имеет целый тип и равен общему числу аргументов, заданных в командной строке при запуске программы.
Второй аргумент argv является массивом указателей на char. Эти указатели содержат адреса строк, в которые помещаются слова из командной строки. Аргументы в командной строке отделяются друг от друга пробелами или табуляциями.
Рис.27. Размещение в памяти аргументов командной строки
Например, пусть есть программа echo, которая просто печатает аргументы своей командной строки, разделяя их пробелами. Запустим ее с помощью следующей командной строки:
…>Echo.exe Hello, World!
программа напечатает:
Hello, World!
Первым аргументом argv[0] является имя программы, поэтому всегда argc >= 1. Если argc == 1, то в командной строке после имени программы никаких аргументов нет. В нашем примере argc == 3 и, соответственно, argv[0], argv[1]. argv[2] – это указатели на строки ”Echo.exe”, ”Hello,”, ”World!”. Согласно стандарту argv[argc] == 0, то есть является пустым указателем. Схема памяти показана на рис.27. Внутри main имеется только указатель argv, в котором хранится адрес нулевого элемента из массива указателей, расположенного вне main. А уже в этом внешнем по отношению к main массиве указателей хранятся адреса строк с аргументами командной строки.