|
Программирование >> Операторы преобразования типа
Доступ к файлам Потоки данных чакже исиользуются для работы с файлами. В стандартную библиотеку С++ входят четыре основных шаблона, для которых определены стандартные специализации. О Шаблон basicjfstreamo со специализациями ifstream и wifstream обеспечивает чтение файлов ( файловый входной поток данных ). О Шаблон basic ofstream<> со специализациями ofstream и wofstream обеспечивает запись файлов ( файловый выходной ноток данных ). О Шаблон basic fstream<> со специализациями fstream и wfstream обеспечивает чтение и запись файлов. О Шаблон basic filebuf<> со специализациями filebuf и wfilebuf используется только другими классами файловых потоков данных для выполпепия фактических операций чтения и записи символов. Иерархия классов файловых потоков данных, представ ленная на рис. 13.2, соответствует общей иерархии базовых классов потоков данных. Эти классы определяются в заголовочном файле <f5tream> следующим образом: namespace std { template <class charT, class traits = char traits<charT> > class basic 1fstream; typedef basic 1fstream<char> ifstream: typedef bas1c 1fstream<wchar t> wifstream; template <clas5 charT. class traits = char traits<charT> > class bas1c ofstream; typedef bas1c ofstream<char> ofstream: typedef bas1c ofstream<wchar t> wofstream; template <class charT. class traits = char tra1ts<charT> > class bas1c fstream: typedef bas1c fstreani<char> fstream; typedef bas1c fstream<wchar t> wfstream; template <class charT. class traits = char tra1t5<charT> > Например, следующая команда преобразует символ новой строки в кодировку, используемую потоком данных: strm.widen(\n) За дополнительной информацией о локальных контекстах и интернационализации обращайтесь к главе 14. class bas1c filebuf; typedef baslc filebuf<char> filebuf: typedef bas1c filebuf<wchar t> wfllebuf:
ba e i c e t re ambu f ic> streambuf / wstreambuf {virtual) basic £ ilebuf<> filebuf / wfilebuf basic istream<> istream / wistream basic ostreazn<> ostream / wostream baa i c i os treazn<> iostream / wiostream ba e ic if a tr eazn<> ifstream / wifstream bae1c ofetraam<> ofstream / wofstream baei c fetra am<> fstream / wfstream Рис. 13.2. Иерархия классов файловых потоков данных Основным достоинством потоковых классов для работы с файлами является автоматизация выполняемых операций. Файлы автоматически открываются во время конструирования и закрываются при уничтожении объекта. Естественно, что эта возможность имеется благодаря соответствующему определению конструкторов и деструкторов. Одно важное обстоятельство, относящееся к потокам данных с поддержкой и чтения и записи, - такие потоки пе должны допускать произвольного переключения между чтением и записьюЧ Чтобы после начала чтения из файла переключиться на запись (или наоборот), необходимо выполнить операцию позиционирования (возможно, с сохранением текущей позиции). Единственное исключение из этого правила относится к чтению с выходом за конец файла; Это ограничение было унаследовано от С Тем не менее оно с большой вероятностью будет поддерживаться и будущими реализациями стандартной библиотеки С++. в этой ситуации можно немедленно переходить к записи символов. Нарушение этого ограничения приводит к нежелательным побочным эффектам. Если при конструировании файлового потока данных в аргументе передается С-строка (тип char*), то при этом автоматически делается попытка открыть файл для чтения и/или записи. Признак успеха этой попытки отражается в состоянии потока данных. Следовательно, после конструирования следует проверить состояние потока дагп1ых. Следуюш программа открывает файл charset.out и записывает в него текущий набор символов (все символы в интервале 32-255): io/charset.cpp #include <string> Строки #include <iostreani> Ввод-вывод #include <fstream> Файловый ввод-вывод #include <iomanip> setwC) #1nclude <cstdlib> exitC) using namespace std; Опережающие объявления void wrIteCharsetToFlle Cconst string& filename): void outputFlle Cconst string filename): 1nt main C) { writeCharsetToFl1e( charset.out ): outputFI1eC cha rset.out ); void WrIteCharsetToFlle (const str1ng& filename) { Открытие выходного файла ofstream f11e(f11ename.c str()); Файл открыт? if (! file) { NO. abort program cerr cant open output file \ filename \ endl; exitCEXn FAILURE): Вывод текущего набора символов for (int 1=32: 1<256; 1++) { file value: setw(3) 1 char; static cast<char>(1) end1; } Автоматическое закрытие файла void outputFlle (const str1ng& filename)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |