На этом шаге мы рассмотрим возможность включения текста из файла.
Для включения текста из файла используется команда #include, имеющая две формы записи:
#include <имя_файла>// Имя в угловых скобках. #include "имя_файла" // Имя в кавычках.
Если имя_файла - в угловых скобках, то препроцессор разыскивает файл в стандартных системных каталогах. Если имя_файла заключено в кавычки, то вначале препроцессор просматривает текущий каталог пользователя и только затем обращается к просмотру стандартных системных каталогов.
Начиная работать с языком C++, пользователь сразу же сталкивается с необходимостью использования в программах средств ввода-вывода. Для этого в начале текста программы помещают директиву:
#include <iostream.h>
Выполняя эту директиву, препроцессор включает в программу средства связи с библиотекой ввода-вывода. Поиск файла iostream.h ведется в стандартных системных каталогах.
По принятому соглашению расширение .h задается у тех файлов, которые нужно помещать в заголовке программы, т.е. до исполняемых операторов.
Кроме такого типа файлов в заголовок программы могут быть включены любые другие файлы (стандартные или подготовленные специально).
Заголовочные файлы оказываются весьма эффективным средством при модульной разработке крупных программ, когда связь между модулями, размещаемыми в разных файлах, реализуется не только с помощью параметров, но и через внешние объекты, глобальные для нескольких или всех модулей. Описания таких внешних объектов (переменных, массивов, структур и т.п.) помещаются в одном файле, который с помощью директив #include включается во все модули, где необходимы внешние объекты. В тот же файл можно включить и директиву подключения библиотеки функций ввода-вывода. Заголовочный файл может быть, например, таким:
#include <iostream.h> extern int ii,jj,ll; //Целые внешние переменные. extern float AA, BB; //Вещественные внешние переменные.
В практике программирования на C++ обычна и в некотором смысле обратная ситуация. Если в программе используется несколько функций, то иногда удобно текст каждой из них хранить в отдельном файле. При подготовке программы пользователь включает в нее тексты используемых функций с помощью команд #include.
В качестве примера рассмотрим задачу обработки строк, в которой используем функции обработки строк, текст каждой из которых находится в отдельном файле.
#include <iostream.h> #include "invert.cpp" // Функция инвертирования строк. #include "conc.cpp" // Функция соединения строк. void main() { char slovo[81], sp[81], c = ' ', *ptr = slovo; sp[0] = '\0'; // Очистка массива для нового предложения. cout << "Введите предложение с точкой в конце:\n"; do { cin >> slovo ; // Читается слово из входного потока. invert(slovo); // Инвертировать слово. c = slovo[0]; // Убрать точку в начале последнего слова. if (c == '.') ptr = &slovo[1]; if (sp[0] != '\0') conc(sp," \0"); // Пробел перед словом. conc(sp,ptr); // Добавить слово в предложение. } while (c != '.'); // Конец цикла чтения. conc(sp,".\0"); // Точка o конце предложения. cout << "\n" << sp; // Вывод результата. }
В файле invert.cpp текст функции:
void invert (char *e) { char s; for (int m=0;e[m]!='\0';m++); for (int i=0,j=m-1;i < j;i++,j--) { s = e[i]; e[i] = e[j]; e[j] = s; } }
В файле conc.cpp текст функции:
void conc (char *c1, char *c2) { for (int m=0;c1[m]!='\0';m++); // m - длина первой строки. for (int i=0; c2[i]!='\0';i++) c1[m+i]=c2[i]; c1[m+i] = '\0'; }
Результат работы программы:
Введите предложение с точкой в конце: А шорох хорош. А хорош шорох.
В программе в символьный массив slovo считывается из входного потока (с клавиатуры) очередное слово; sp - формируемое предложение, в конец которого всегда добавляется точка. Переменная char c - первый символ каждого инвертированного слова. Для последнего слова предложения этот символ равен точке. При добавлении этого слова к новому предложению точка отбрасывается с помощью изменения значения указателя ptr.
Использованы директивы #include, включающие в программу средства ввода/вывода и тексты функций инвертирования строки invert() и конкатенации строк conc(). Обратите внимание, что длина массива - первого из параметров функции conc() должна быть достаточно велика, чтобы разместить результирующую строку.
Препроцессор добавляет тексты всех функций в программу из файла c78_1.cpp и как
единое целое передает на компиляцию.
На следующем шаге мы рассмотрим директивы условной компиляции.