Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

InStream.Open("character.Dat"); /*присоединение файла к входному потоку */

for(int i=0; i<5;i++) { //цикл для чтения смволов из файла

inStream>> ch2[4-i]; //чтение символов из файла

// с помощью входного потока

}

for(int i=0; i<5;i++) {

cout<< ch2[i]; // стандартный выовод с помощью потока

//библиотеки iostream

}

InStream.Close(); //закрытие входного потока

}

Обратите внимание, что при объявлении потоков не указано с каким типом данных работает этот поток. Именно в этом состоит особенность организации потоков.

Для того чтобы лучше понять, что такое поток попробуйте вместо массива ch1[5]объявить и в дальнейшем использовать массив целых чисел. Тогда программа будет записывать в файл целые числа, а считывать символы. Также можно объявить массив чисел с плавающей точкой и посмотреть, что получится в этом случае.

Мы уже говорили, что используемые ранее оператора ввода с клавиатуры cin и вывода на экран cout на самом деле являются потоками. В одной программе может существовать несколько потоков одновременно, что, и продемонстрировано примером. Нужно только помнить, что перед выходом из программы все потоки нужно закрыть. В противном случае не исключена возможность повреждения информации в файле. Еще раз подчеркнем, что закрытие потоков производится с помощью функции-члена close, которая присутствует в обоих классах ifstream и ofstream.

Классы ifstream и ofstream имеют конструкторы, которые автоматически открывают файл. Параметры этих конструкторов принимают те же значения по умолчанию, что и функция open(). По этой причине файлы часто открывают следующим образом:

ifstream mystream(“myFile”);//открытие файла для ввода

Поток – это объект поточного класса. Если поток открыть не удалось, например из-за того, что не подключен диск с нужным файлом, то поток возвращает false, иначе true.

Это свойство можно использовать для проверки открытия потока.

if(!mystream){

cout<<”Не удается открыть файл myFile”<<endl;

Кроме функций open и close эти классы имеют другие полезные функции. Например, для проверки того, что выбранное действие с потоком оказалось удачным существует функция fail(), что можно перевести как неудача, провал. Функция не имеет аргументов. Вызов функции для потока outStream, который использовался в программе, выглядит следующим образом:

outStream.fail();

Функция возвращает значение типа bool. Причем если действие оказалось неудачным, то возвращаемое значение равно true в случае удачи false.

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

outStream.open("character.dat"); //присоединение файла к

// выходному потоку

if (outStream.fail()){

cout<<”Не удается открыть файл character.dat\n";/*печать сообщения об ошибке */

exit(1); // Функция аварийного завершения работы.

}

Функция exit(int n) ничего не делает с потоками, она только немедленно завершает работу процесса или программы и передает вызвавшему ее процессу, которым обычно является операционная система, код возврата. На самом деле все сделано не так просто. Сначала вызываются специальные функции завершения программы, которые сбрасывают содержимое буферов в открытые файлы и закрывают эти файлы. После этого функция exit(n) возвращает свой аргумент операционной системе. Та в свою очередь ничего не делает если n=0, но если n=1, то предпринимает действия предусмотренные при установке системы. В качестве параметра функции exit могут также использованы константы EXIT_SUCCESS и EXIT_FAILURE, эквивалентные 0 и 1. Конечно, функция exit, как и все другие функции, тоже принадлежит к какому то классу или библиотеке. Имя этой библиотеки cstdlib. Формально, для того чтобы получить доступ к этой функции нужно в заголовочном файле указать директиву

#include <cstdlib>

т.е. подключить стандартную библиотеку. Большинство компиляторов делают это автоматически без дополнительных указаний.

Аргументом функции exit может быть любое число, однако по принятому соглашению используются только 0 и 1.

Пример программы с потоками в среде C++Builder

В качестве примера работы с потоками создадим форму с двумя окнами и меню содержащее разделы «Открыть» и «Сохранить». В левое окно записывается какой-нибудь текст, который с помощью меню сохраняется в файле на жестком диске. В правом окне сохраненный текст, также с использованием меню, может быть прочитан.

На форме следует разместить компоненты Главное меню (MainMenu), два окна Edit, диалоги OpenDialog и SaveDialog.

В окне кода следует подключить библиотеку

#include <fstream.h>

Кроме того нужно создать глобальную переменную в которую будут записываться имена файлов

AnsiString MyFile;

Далее нужно создать меню «Файл» с разделами «Открыть», «Сохранить» и «Выход»

Целесообразно присвоить данным разделам имена. Далее это соответственно File, Open, Save и Exit.

Теперь нужно создать обработчики событий, которые возникают при щелчке мыши по разделам меню.

void __fastcall TForm1::SaveClick(TObject *Sender)

{

if(OpenDialog1->Execute())

MyFile=OpenDialog1->FileName;

else{

ShowMessage("Невозможно открыть файл "+MyFile);

return;

}

//создание потока и работа с ним

ofstream out(MyFile.c_str());//вызов конструктора потока