Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_programmirovania.pdf
Скачиваний:
182
Добавлен:
08.04.2015
Размер:
1.76 Mб
Скачать

О файлах и командной строке 137

выведет имена исполняемых файлов. Звездочка в командах заменяет произвольный набор символов в именах файлов. Результат выполнения этой команды виден на рис. 45.

Любую из созданных программ можно выполнить, набрав ее имя в командной строке, например, команда

…>AllocMem.exe

запустит на выполнение программу AllocMem.exe. Заметим, что DOS считает большие и малые буквы одинаковыми.

Для возврата из режима командной строки в среду TC нужно выполнить команду exit.

11.3. Перенаправление стандартного ввода и вывода на файл

Операционная система позволяет направить стандартный ввод на файл вместо клавиатуры, а стандартный вывод на файл вместо экрана. Для такого перенаправления ввода и вывода программу следует запустить из командной строки, в которой указать входной и выходной файлы. Как это сделать, разберем это на примере программы 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.0765 480.34 1100

Сохраним набранные данные в файле Dtreceip.cpp. Запустим программу 13 командной строкой:

D:\AUser\Programs>Receipt.exe < Dtreceip.cpp

Программа прочитает входные данные из указанного файла Dtreceip.cpp, а результаты выведет на экран.

Чтобы перенаправить стандартный ввод на чтение из файла, а вывод направить не на экран, а в файл, следует запустить программу командной строкой:

138 11

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, можно запускать программы с

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

Свойства ярлыка нужную командную строку. Имена входного

Dtreceip.cpp и выходного result.txt файлов указаны кратко, они отыскиваются в Рабочей папке.

О файлах и командной строке 139

Рис.47. Свойства ярлыка для запуска программы

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

Доступ к командной строке имеется также у файловых менеджеров типа Far или Windows Commander.

Перенаправить на файл можно только стандартный ввод и вывод. Если в программе используется, например, функция getch, которая не относится к стандартному вводу, то программа, запущенная подобной командной строкой, работать не будет (зависает).

11.4. Аргументы командной строки

При запуске программы на выполнение функция main может получить из операционной среды два аргумента. Для доступа к ним main должна быть объявлена с двумя формальными аргументами в виде:

void main(int argc, char* argv[])

Первый аргумент argc имеет целый тип и равен общему числу аргументов, заданных в командной строке при запуске программы.

Второй аргумент argv является массивом указателей на char. Эти указатели содержат адреса строк, в которые помещаются слова из командной строки. Аргументы в командной строке отделяются друг от друга пробелами или табуляциями.

140 11

 

 

main

 

 

 

окружение main

 

 

 

 

 

 

 

 

argv

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

echo.exe\0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

argc

 

 

 

 

 

Hello \0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3World!\0

0

Рис.49. Размещение в памяти аргументов командной строки

Например, пусть есть программа 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, то есть является пустым указателем. Схема памяти показана на рис.50. Внутри main имеется только указатель argv, в котором хранится адрес нулевого элемента из массива указателей, расположенного вне main. А уже в этом внешнем по отношению к main массиве указателей хранятся адреса строк с аргументами командной строки.

Программа 31. Эхо аргументов командной строки

Программа Echo трактует argv как массив символьных указателей.

// Файл Echo.cpp #include <iostream.h> #include <conio.h>

int main(int argc, char* argv[])

{

int i;

for(i = 1; i < argc; i++) // Перебор аргументов командной строки cout << argv[i] << (i < argc - 1 ? " " : "\n");

getch(); return 0;

О файлах и командной строке 141

}

Выражение i < argc – 1 ?" " : "\n" равно строке из одного пробела либо строке из одного символа новая строка, когда i равен номеру последнего аргумента. Это обеспечивает вывод пробела между аргументами и переход на новую строку после вывода последнего аргумента.

Программа 32. Печать строк, содержащих образец

Программа определяет те вводимые строки, которые содержат образец, заданный в командной строке.

В программе использована библиотечная функция: char* strstr(char* s1, char* s2);

которая проверяет, входит ли строка s2 в строку s1, и возвращает указатель на тот символ строки s1, с которого начинается строка s2. Если строка s1 не содержит строки s2, то функция возвращает NULL. Прототип этой функции содержится в файле string.h.

//Файл PrnExmpl.cpp

//Печать строк из файла, содержащих образец

//Файл и образец задаются в командной строке #include <fstream.h>

#include <string.h> #include <stdlib.h> #include <conio.h>

int main(int argc, char* argv[])

{

const int MAXLINE = 1000;

// Максимальная длина строки

char line[MAXLINE];

// Место для строк

char* name_progr = argv[0];

// Запоминаем имя программы

ifstream fin;

 

// Входной файловый поток

if(argc < 3)

// Если аргументов в командной строке не хватает

cout << "Используйте командную строку: \n" << name_progr << " file образец\n";

else{

 

fin.open(argv[1]);

// Файл открывается на чтение

if(!fin){

// Если не удалось открыть файл

cerr << "Файл " << argv[1] << " Не найден \n";

exit(1);

 

}

 

while(!fin.eof()){

// Пока не достигнут конец файла,

fin.getline(line, MAXLINE);

// читается строка

if(strstr(line, argv[2]) != NULL)

// Если образец есть

cout << line << '\n';

// Печать строки

14211

}// while

}

// else

getch();

 

return 0;

 

}

Исходный текст данной программы находится в файле PrnExmpl.cpp, рабочая программа – в файле PrnExmpl.exe. Оба файла находятся в одном каталоге. Выполнение командной строки:

…> PrnExmpl.exe

приводит к появлению на экране следующих строк:

Используйте командную строку: …\PrnExmpl.exe file образец

Зададим в качестве исходного файл PrnExmpl.cpp, содержащий исходный текст рассматриваемой программы, а в качестве образца строку из двух символов ”<<”, то есть выполним командную строку:

…> PrnExmpl.exe PrnExmpl.cpp <<

На экране появилось:

cout << "Используйте командную строку: \n" << name_progr << " file образец\n";

cerr << "Файл " << argv[1] << " Не найден \n"; cout << line << '\n'; // Печать строки

Программа вывела на экран те строки файла PnExmpl.cpp, которые содержат в качестве подстроки образец ”<<”.

При запуске программы из интегрированной среды TC можно задать аргументы командной строки в диалоговом окне Program

Arguments, вызываемом командой меню Run, Arguments . При этом в

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

В C++ Builder есть аналогичная команда Run, Parameters, открывающая диалог Run Parameters, рис.51, на котором в поле Parameters вводятся аргументы командной строки.