КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |