Шаг 78.
Включение файлов (директива #include)

    На этом шаге мы рассмотрим возможность включения текста из файла.

    Для включения текста из файла используется команда #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.

    В качестве примера рассмотрим задачу обработки строк, в которой используем функции обработки строк, текст каждой из которых находится в отдельном файле.


    Пример 1. Ввести с клавиатуры заканчивающееся точкой предложение, слова в котором отделены друг от друга пробелами. Записать каждое слово предложения в обратном порядке (инвертировать слово) и напечатать полученное предложение. Для простоты реализации ограничим длину вводимого предложения 80 символами. Тогда программа решения сформулированной задачи может быть такой:
#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 и как единое целое передает на компиляцию.

    На следующем шаге мы рассмотрим директивы условной компиляции.


Предыдущий шаг Содержание Следующий шаг