МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
БАШКИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Практикум на ЭВМ
Технология программирования в среде С++
часть 2
для студентов Башгосуниверситета
Уфа
РИО БашГУ
2007
Составители:
Трунов К.В., Рыков В.И. Методы и технологии С++. Технология программирования в среде С++. /Издание Башкирского ун-та. - Уфа 2007. - ХХ c.
Работа посвящена методологии программирования на языке С++.
Содержит сведения по основным инструментальным средствам Microsoft Visual C++ и технологии разработки программ в указанной среде.
Работа используется при выполнении лабораторных и практических работ по дисциплине «Практикум на ЭВМ» - семестр 2.
1 Текстовые файлы 4
1.1 Открыть файл. 7
1.2 Ввод символов. 8
1.3 Вывод символов. 10
1.4 Закрыть файл. 11
1.5 Числовые данные в текстовых файлах. 11
1.6 Копирование файлов 14
2 Строки класса string 15
3 Графика 16
4 Введение в классы) 21
4.1 Формирование облика класса Sphere 23
4.2 Формирование С++ проекта 28
4.3 Документирование работы с классом 29
4.4 WEB публикация 30
4.5 Общая технология решения объектных задач 32
5 Перегрузка операций 33
5.1 Перегрузка операций инкремента 35
6 Связные списки 36
6.1 Технология связных списков 36
6.2 Стандартная библиотека шаблонов языка C++ 37
6.3 Шаблонный класс list из библиотеки STL 39
6.4 Методика решения задач 42
7 Графы, двоичные деревья 46
7.1 Обход корневого дерева 46
7.2 Решение задачи построения дерева поиска 47
8 Графы, системы дорог 50
9 Литература 50
1Текстовые файлы
Файлы представляют собой постоянное хранилище информации. В частности, это способ связи между разными программами. Программа А может записать результаты своей работы в файл, который позднее прочтет программа В. Однако файлы, уничтожаемые после выполнения программы, также не редкость. Например, при выполнении программы могут создаваться временные файлы, в которых хранится информация, не помещающаяся в оперативной памяти.
Полезно сравнить файлы с их ближайшими родственниками в языке C++ — массивами. Файлы и массивы похожи, поскольку они представляют собой совокупности компонентов, имеющих одинаковый тип. Например, можно создать массив, имеющий тип char, и файл такого же типа. В обоих случаях компонентами являются символы. Однако между файлами и другими типами данных есть отличия: например, файлы могут существовать после завершения работы программы, а массивы нет. Укажем еще несколько различий между файлами и массивами.
-
• Файлы могут увеличиваться в ходе выполнения программы, а массивы имеют фиксированный размер. Объявив массив, программист указывает его максимальный размер. Следовательно, оперативная система выделит этому массиву соответствующую область памяти. Хорошо написанная программа, перед тем как вставить в массив новый элемент, всегда проверяет, достаточно ли там места. Если места не достаточно, программа должна завершить работу и вывести на экран сообщение об ошибке. Программист может увеличить размер массива, например, изменив значение именованной константы, а затем скомпилировать и выполнить программу вновь. Если объявить максимальную длину массива больше, чем нужно, часть памяти останется неиспользованной. С файлом этого случиться не может. Когда система создает файл в первый раз, он требует очень мало памяти. По мере того как программа добавляет в него новые записи, размеры файла увеличиваются, пока ресурсы внешнего запоминающего устройства не исчерпаются полностью. Таким образом, в любой фиксированный момент времени файл занимает именно столько памяти, сколько ему нужно.
-
• Файлы обеспечивают как последовательный, так и прямой доступ; массивы обеспечивают только прямой доступ. Если нужно обратиться к 100-му элементу массива array, можно просто записать выражение array [99], не просматривая элементы от array [0] до array [98]. Разумеется, в массиве можно имитировать и последовательный доступ, но при этом каждый следующий элемент все равно будет доступен независимо от предыдущего В то же время доступ к записи в файле может быть как последовательным, так и прямым. Если нам нужен 100-й элемент файла, его можно считать, указав позицию, не считывая первые 99 элементов. Однако при последовательном доступе прежде, чем обратиться к 100-му элементу, придется перебрать предыдущие 99.
Файлы классифицируются следующим образом. Текстовый файл (text file) состоит из строк символов. В частности, все файлы, которые создаются текстовыми редакторами, в том числе исходные коды программы на языке C++, являются текстовыми. Поскольку текстовые файлы состоят из символов, а обращаться к ним по номеру позиции не всегда удобно, обычно они предоставляют последовательный доступ. Файлы, которые не являются текстовыми, называются бинарными (binary), а иногда — файлами общего вида (general file), или просто нетекстовыми файлами (nontext file).
Текстовые файлы предназначены для людей. Они представляют собой довольно гибкий и полезный инструмент, но не настолько эффективны с точки зрения затрат компьютерного времени и объема занимаемой памяти, как бинарные файлы.
На первый взгляд, кажется, что текстовые файлы состоят из строк. Эта иллюзия часто порождает недоразумения. На самом деле, текстовые файлы, как и любые другие файлы, являются последовательностями компонентов, имеющих одинаковый тип. Иначе говоря, текстовый файл представляет собой последовательность символов. Причиной этого эффекта является признак конца строки (end-of-line symbol).
При создании текстового файла для перехода на следующую строку пользователи компьютеров нажимают клавишу , вставляя в конце строки символ ее окончания. Когда устройство вывода, например, принтер или монитор, обнаруживает в текстовом файле признак конца строки, он делает переход на новую строку. В языке C++ признаком конца строки является символ /n.
Кроме того, существует специальный признак конца файла (end-of-file symbol), который находится сразу за последним компонентом
Этот символ может фактически отсутствовать, но в языке С++ предполагается, что он существует. Роль этого символа играет предопределенная константа EOF. В нашей книге мы предполагаем, что все текстовые файлы, включая пустой, содержат специальные символы конца строки и конца файла (рис. А. 1.1).
Рис. 1.1. Текстовый файл с символами конца строки и конца файла
Любая программа, использующая файлы, должна иметь доступ к стандартной библиотеке потоков языка C++. Для этого необходимо включить в программу следующую директиву и оператор.
#include
using namespace std;
В этой библиотеке предусмотрены три типа потоков: ifstream для входных файлов, ostream — для выходных файлов и fstream — для файлов ввода/вывода.
Для поддержки файлового ввода и вывода стандартная библиотека C++ содержит классы, указанные в табл. 1.1.
Таблица 1.1 Классы файловых потоков
Класс
|
Инстанцирован из шаблона
|
Базовый шаблонный класс
|
Назначение
|
ifstream
|
basic_ifstream
|
basic_istream
|
Входной файловый поток
|
ofstream
|
basic_ofstream
|
basic_ostream
|
Выходной файловый поток
|
fstream
|
basic_fstream
|
basic_iostream
|
Двунаправленный файловый поток
|
Так как классы файловых потоков являются производными от классов istream, ostream и iostream соответственно, то они наследуют все методы указанных классов, перегруженные операции вставки и извлечения, манипуляторы, состояние потоков и т. д.
Для использования файловых потоков необходимо подключить к программе заголовочный файл .
Работа с файлом обычно предполагает следующие операции:
-
создание потока (потокового объекта);
-
открытие потока и связывание его с файлом;
-
обмен с потоком (ввод/вывод);
-
закрытие файла.
Классы файловых потоков содержат несколько конструкторов, позволяющих варьировать способы создания потоковых объектов.
Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом:
ifstream(const char* name, int mode = ios::in);
ofstream(const char* name, int mode = ios::out | ios::trunc);
fstream(const char* name, int mode = ios: :in | ios::out);
Второй параметр конструктора задает режим открытия файла. Если значение по умолчанию вас не устраивает, можно указать другое, выбрав одно или несколько значений (объединенных операцией |) из указанных в табл. 1.2.
Таблица 1.2. Значения аргумента mode
Флаг
|
Назначение
|
s::in
|
Открыть файл для ввода
|
ios::out
|
Открыть файл для вывода
|
ios::ate
|
Установить указатель на конец файла
|
ios::app
|
Открыть в режиме добавления в конец файла
|
ios::trunc
|
Если файл существует, то обрезать его до нулевой длины
|
ios::binary
|
Открыть в двоичном режиме (по умолчанию используется текстовый режим)
|
ios::nocreate
|
Если файл не существует, зафиксировать ошибку (установкой потокового объекта в нулевое значение
|
ios::noreplace
|
Если файл существует, зафиксировать ошибку
|
Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом. В этом случае связь потока с конкретным файлом осуществляется позже — вызовом метода open() , который имеет параметры, аналогичные параметрам рассмотренных выше конструкторов.
Приведем примеры создания потоковых объектов и связывания их с конкретными файлами:
// Файлы для вывода
ofstream flog(“flog.txt”);
ofstream foutl. fout2;
foutl.open( "testl". ios::арр);
fout2.open("test2", ios::binary);
// Файл для ввода
ifstream finpl(“data.txt”);
// Файл для ввода и вывода
fstream myfile;
myfile.open(“mf.dat”);
Если в качестве параметра name задано краткое имя файла (без указания полного пути), то подразумевается, что файл открывается в текущем каталоге, в противном случае требуется задавать имя файла с путем.
|