- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
О файлах и командной строке 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 вводятся аргументы командной строки.