Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posobie_Cpp.doc
Скачиваний:
7
Добавлен:
20.11.2019
Размер:
603.14 Кб
Скачать

5. Заголовочные файлы.

Заголовочные файлы C++

Каждая создаваемая вами программа на C++ начинается с одного или нескольких операторов #include. Эти операторы указывают компилятору включить содержимое заданного файла (заголовочного файла) в вашу программу, как если бы программа содержала операторы, которые находятся во включаемом файле. Заголовочные файлы содержат определения, используемые компилятором для операций различных типов. Существуют заголовочные файлы, которые определяют операции В/В (ввода/вывода) C++, системные функции (например, функции, возвращающие текущие дату и время) и многое другое.

Заголовочные файлы, подобно программам на C++, представляют собой файлы в формате ASCII, содержимое которых вы можете просмотреть или напечатать. Чтобы лучше понять содержимое заголовочных файлов, найдите время для того, чтобы напечатать заголовочный файл IOSTREAM.H, содержимое которого вы будете использовать в каждой создаваемой вами программе на C++. Обычно заголовочный файл IOSTREAM.H расположен в подкаталоге с именем INCLUDE, который находится в каталоге, содержащем файлы компилятора C++. Используйте текстовый редактор, чтобы просмотреть и напечатать содержимое заголовочных файлов.

Замечание: Никогда не изменяйте содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой создаваемой вами программе.

6. Работа с файлами

Небольшой объем информации можно передавать в программу с помощью клавиатуры, а результаты работы программы выводить на экран дисплея. Однако скоро становится ясным, что многие задачи требуют организации ввода/вывода информации из/в файл. Язык С++ поддерживает как старый способ работы с файлами, унаследованный от С, так и более новый, основанный на понятии потокового ввода/вывода. Файловый ввод/вывод в этом случае во многом подобен стандартному вводу/выводу (cin и cout) , основанному на понятии класса. Кратко о классах будет сказано далее, пока же мы рекомендуем запомнить некоторые формальные правила.

6.1 Простой файловый ввод/вывод

Для использования файлов следует:

  • подключить заголовочный файл fstream.h

  • создать объект класса fstream;

  • поставить этот объект в соответствие определенному файлу;

  • использовать его так же, как объект cin (для ввода) или cout (для вывода).

Имя объекта, предназначенного для работы с файлом, может быть любым, допустимым в С++. Например, fout, outFile, didi и т.д.

Рассмотрим возможные варианты работы с файлами на примерах. Вот так можно записать текст в файл.

fstream fin; // создаем объект класса fstream

fin.open("test",ios::in); // ставим ему в соответствие файл, открываем

//для чтения

fstream(fout);// допускается и такой тип объявления

fout.open (”a.dat”, ios::out); // а в этот файл будем записывать

char* str=”test string”;

fout>>str; // записываем строку в файл

// по окончанию работы с файлами, их следует закрыть:

fin.close();

fout.close();

В приведенном примере можно совместить объявление и инициализацию файловой переменной:

fstream fin("test",ios::in);

fstream fout(”a.dat”, ios::out);

Организовать корректное чтение из файла немного сложнее. Дело в том, что текстовый по типу файл заканчивается служебным символом eof – конец файла. При попытке прочесть информации больше, чем есть в файле, произойдет ошибка. Чтобы правильно произвести чтение из файла обычно используют цикл while() с проверкой конца файла встроенной функцией eof(). Следующий листинг показывает, как подсчитать количество символов в текстовом файле.

setlocale(LC_ALL,"Russian");

fstream fin("test.txt",ios::in);

char temp;

int counter=0;

while(!fin.eof()) // пока не конец файла

{

fin>>temp; //считываем символ в temp

counter++; //подсчет символов

}

cout<<”всего символов в файле равно ”<<counter<<endl;

При записи следует выполнить схожие действия. Предположим, в файле 1.txt содержится последовательность целых чисел. Следует переписать их в другой файл – 2.txt.

#include <fstream.h>

void main()

{

int temp, i=0;

fstream f("1.txt", ios::in);

fstream f2("2.txt", ios::out);

while(!f.eof) // чтение в цикле с проверкой конца файла

{

f>>temp;

i++;

f2<<i<<" - "<<temp<<endl;

}

f.close();

f2.close();

}

В следующем примере рассмотрен процесс «пузырьковой» сортировки элементов массива, которые считываются из одного файла, например, 1.txt и уже отсортированные по возрастанию записываются в другой файл (2.txt).

#include <fstream.h>

void main()

{

//Объявление вспомогательной переменной temp и счетчика,

//счетчик в начале равен нулю

int temp, counter=0;

//Открываем файл для чтения

fstream f("1.txt", ios::in);

while(!f.eof)

{

f>>temp;

counter++;

}

f.close();

//Объявление динамического массива типа int

// с количеством элементов counter

int *b=new int[counter];

// снова открываем файл и считываем числа в массив

f.open("1.txt", ios::in);

for(int i=0; i<counter; i++)

{

f>>b[i];

}

// мы последовательно сравниваем

// соседние элементы массива и, если надо, меняем их местами

// Сортировку повторить

// counter раз

for(i=0; i<counter-1; i++)

for(int j=i+1; j<counter; j++)

if(b[i]>b[j])

{

temp=b[i];

b[i]=b[j];

b[j]=temp;

}

//Открываем второй файл на запись

fstream f2("2.txt", ios::out);

//Выполняем запись в файл

for(i=0; i<counter; i++)

{

f2<<b[i]<<" ";

}

f.close();

f2.close();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]