Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Конструкторы файловых потоков




Лекция 24

Расширение потоков для типов, определяемых пользователем

 

 

Можно легко расширить библиотеку, чтобы приспособить операции помещения/извлечения к собственным типам данных. Для этого следует определить две функции со следующими заголовками:

// Чтение данных из потока

istream& operator >> (istream &is, имя_типа &имя_перем.);

// Запись данных в поток

оstream& operator << (ostream &os, имя_типа &имя_перем.);

 

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

Пример расширения потоков для объектов class dog.

 

#include<iostream.h>

#include<iomanip.h>

class dog

{

char*poroda;

char*name;

int nomer;

friend istream &operator>>(istream &is, dog &x.);

friend оstream &operator<<(ostream &os, dog &x.);

};

istream &operator>>(istream &is, dog &x.);

{

poroda=new char[15];

name=new char[10];

cout<<”Введите породу” <<endl;

is>>x.poroda;

cout<<”Введите имя” <<endl;

is>>x.name;

cout<<”Введите номер” <<’\n’;

is>>x.nomer;

return is;//Обязательно!

}

оstream&operator<<(ostream&os, dog &x.);

{

os<<”Порода–” <<x.poroda<<” Имя–”<<x. name<<” Номер–”<<x. nomer<<’\n’;

return os;//Обязательно!

}

void main()

(

dog q;

cin>>q;

cout<<q;

}

 

Описан объект q класса dog. При его вводе вызывается дружественная функция operator>>(). В этой функции вместо формальных параметров (ссылок) x и is будут соответственно q и cin. Результат работы функции через return is присваивается предопределенному объекту класса istream cin. Аналогично выполняется дружественная функция operator<<().

 

24.1 Файловый ввод/вывод с применением потоков С++

 

 

Библиотека С++ содержит три специализированные класса для файлового ввода/вывода. Это следующие классы:

ifstream – для операций с входным дисковым файлом;

ofstream– для операций с выходным дисковым файлом;

fstream – для входных и выходных операций с файлом.

Эти классы являются производными соответственно от istream, оstream и iostream. Таким образом, они наследуют все их функциональные особенности, в т.ч. перегруженные операции << и >> для встроенных типов.

 

 

 

 

Для каждого из трех классов файловых потоков предусмотрено по четыре перегруженных конструктора. Рассмотрим два из них, применяемых наиболее часто. Это, в первую очередь, три пустых конструктора:

ifstream() ofstream() fstream()

{ { {

} } }

Они конструируют объекты, не открывая файла. Например, ifstream ifs; ofstream ofs; fstream f1,f2;

Три вторых конструктора позволяют конструировать объект, открыть файл и прикрепить объект к файлу. Их заголовки имеют вид:

ifstream(const char*name,int omode=ios::in,int prot=filebuf::openprot);

ofstream(const char*name,int omode=ios::out,int prot=filebuf::openprot);

fstream (const char*name,int omode, int prot=filebuf::openprot);

 

24. 3 Открытие файла

 

Чтобы открыть файл, можно использовать конструкторы ifstream, ofstream или fstream. Автоматически вызываются вторые конструкторы. Для ifstream и ofstream обязательными являются лишь имена файлов. Остальные два параметра берутся по умолчанию. При вызове fstream необходимо обязательно передать первые два параметра: имя файла и режим его работы.

Примеры.

ifstream ifs1(“ish.dan”);

ofstream of1(“rezult.dan”);

ofstream of2(“rezult2.txt”,ios::app);

 

Файл rezult2.txt используется для дозаписи в конец файла (append).

 

fstream fil1(“file1.txt”,ios::in);

file1.txt – для чтения.

fstream fil2(“file2.dan”,ios::out);

fstream fil3(“file3.dan”,ios::app);

 

Файлы file2.dan и file3.dan созданы соответственно для записи и для дозаписи в конец файла.

Открыть файл можно также с помощью функции –члена open() класса ios. Ее прототип имеет вид:

filebuf*open(const char*name,int mode, int prot=filebuf::openprot);

При ее вызове обязательными являются только первые два параметра: имя файла и режим его работы (доступа). Режимы доступа задаются перечисляемыми битовыми масками в классе ios.

еnum open_mode

{

in=0x01://open for reading

out=0x02://open for writing

ate=0x04://seek to end of file upon original//open

app=0x08://append mode

trunc=0x10://trancate file if already exist

nocreate=0x20:// open fails if file doesn’t exist

noreplace=0x40:// open fails if file already exists

binary=0x80:// binary file

};

Примеры.

Предположим, с помощью пустого конструктора были созданы объекты:

fstream fin, fout;

fin.open(“ish.dan”, ios::in);

fout.open(“rez.dan”, ios::out);

 

Эти два файловых объекта открыты соответственно для чтения и для записи. Можно указывать несколько режимов доступа через вертикальную линию. Например:

fout.open(“rez.dan”, ios::out|ios::ate);

 




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 866; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.