ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4229
Скачиваний: 28
Глава 40. Потоки ввода/вывода в C++
501
введено
n-1
символов, где
n
равно ширине поля ввода, уста-
новленного в потоке;
встретился не пробельный символ;
встретился конец файла.
В любом случае после завершения ввода каждый из этих опера-
торов устанавливает ширину поля ввода равной нулю.
Если не было введено ни одного символа, то каждый из этих опе-
раторов вызывает функцию
is.setstate(failbit)
.
40.4.4. Шаблон класса
basic_iostream
В заголовочном файле istream также определен шаблон класса
basic_iostream<E, T>
, который определяет базовые классы для
потоков ввода/вывода, а также типы — синонимы специализаций
этого шаблона:
template <class E, class T = char_traits<E>>
class basic_iostream: public basic_istream<E, T>,
public basic_ostream<E, T>
{
public:
explicit basic_iostream(basic_streambuf<E, T>& *sb);
virtual ~basic_iostream();
};
Параметр
E
шаблона задает тип символов, которые являются эле-
ментами потока, а параметр
T
определяет характеристики
этих символов. Подробно характеристики символов описаны в
разд. 9.1
.
Как видно из этого определения, шаблонный класс
basic_iostream<E, T>
является наследником базовых потоков
ввода
basic_istream<E, T>
и вывода
basic_ostream<E, T>
. Но при
этом заметим, что класс
basic_ios<E, T>
наследуется через эти
базовые классы виртуально. Поэтому шаблонный класс
basic_iostream<E, T>
разделяет один буфер для ввода и вывода
данных.
Часть IV. Стандартная библиотека языка программирования С++
502
40.5. Стандартные потоки
ввода/вывода <iostream>
В заголовочном файле iostream определены следующие стандарт-
ные потоки ввода/вывода, которые работают с символами типа
char
и связаны со стандартными потоками ввода/вывода, опреде-
ленными в языке программирования С:
namespace std
{
extern istream cin; // ввод из stdin
extern ostream cout; // вывод в stdout
extern ostream cerr; // вывод в stderr
extern ostream clog; // вывод в stderr
};
Также в заголовочном файле iostream определены следующие
стандартные потоки ввода/вывода, которые работают с широки-
ми символами типа
wchar_t
и связаны со стандартными потоками
ввода/вывода, определенными в языке программирования С:
namespace std
{
extern wistream wcin; // ввод из stdin
extern wostream wcout; // вывод в stdout
extern wostream wcerr; // вывод в stderr
extern wostream wclog; // вывод в stderr
};
Так как стандартные потоки ввода/вывода являются объектами,
то они объявляются в заголовочном файле iostream. Предполагает-
ся, что эти объекты конструируются в объектном файле, который
получен из исходного файла, содержащего заголовочный файл
iostream. Причем эта инициализация выполняется до начала ис-
полнения функции
main
. Конструирование стандартных потоков
гарантируется исполнением функции
basic_ios<charT,traits>::
Init
. Эту функцию нужно вызывать в конструкторах статических
объектов, если они работают со стандартными потоками, т. к.
статические объекты инициализируются до передачи управления
функции
main
.
Глава 40. Потоки ввода/вывода в C++
503
40.6. Базовые потоки ввода/вывода
в файлы <fstream>
В заголовочном файле fstream определены следующие шаблоны и
типы — синонимы специализаций этих шаблонов:
namespace std
{
template<class E, class T = char_traits<E>>
class basic_ofstream;
typedef basic_ofstream<char> ofstream;
typedef basic_ofstream<wchar_t> wofstream;
template<class E, class T = char_traits<E>>
class basic_ifstream;
typedef basic_ifstream<char> ifstream;
typedef basic_ifstream<wchar_t> wifstream;
template<class E, class T = char_traits<E>>
class basic_fstream;
typedef basic_fstream<char> fstream;
typedef basic_fstream<wchar_t> wfstream;
};
Шаблоны классов
basic_ofstream<E, T>
,
basic_ifstream<E, T>
и
basic_fstream<E, T>
предназначены для создания потоков выво-
да, ввода и ввода/вывода в файлы. Типы
ofstream
,
wofstream
,
ifstream
,
wifstream
,
fstream
и
wfstream
являются синонимами
специализаций этих шаблонов классов и предназначены для оп-
ределения потоков, работающих с символами типов
<char>
и
<wchar_t>
соответственно.
В заголовочном файле fstream также определен шаблон класса
basic_filebuf<E, T>
, который используется для создания буфера,
связанного с файлом. Кроме того, определены типы
filebuf
и
wfilebuf
, которые являются синонимами для специализаций это-
го шаблона и предназначены для создания буферов, работающих
с символами типов
<char>
и
<wchar_t>
соответственно. Буфер по-
тока создается самим потоком при его инициализации. Так как
прикладные программы редко работают с буфером потока на-
прямую, то буферы потоков рассматриваться не будут.
Часть IV. Стандартная библиотека языка программирования С++
504
40.6.1. Шаблон класса
basic_ofstream
Шаблон класса
basic_ofstream<E, T>
имеет следующий интер-
фейс:
template <class E, class T = char_traits<E>>
class basic_ofstream: public basic_ostream<E, T>
{
public:
// конструкторы
basic_ofstream();
explicit basic_ofstream(const char *s,
ios_base::openmode mode = ios_base::out);
// функции-члены
basic_filebuf<E, T> *rdbuf() const;
void open(const char *s,
ios_base::openmode mode = ios_base::out);
bool is_open() const;
void close();
};
Параметр
E
шаблона задает тип символов, которые являются эле-
ментами потока, а параметр
T
определяет характеристики этих
символов. Подробно характеристики символов описаны в
разд. 39.1
.
Конструктор по умолчанию создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем вызывает
конструктор базового класса
basic_ostream<E, T>
, передавая ему
в качестве аргумента указатель на буфер потока.
Второй конструктор также создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем открывает
файл, на имя которого указывает параметр
s
, в режиме
mode|ios_base::out
. Возможные режимы открытия файла описа-
ны в
разд. 40.2.1.3
. Если открытие файла закончилось неудачей,
то конструктор вызывает функцию
setstate(failbit)
.
Функции-члены шаблона класса
basic_ofstream<E, T>
выполняют
следующие действия:
Глава 40. Потоки ввода/вывода в C++
505
rdbuf
— возвращает адрес буфера потока;
open
— открывает файл, на имя которого указывает параметр
s
,
в режиме
mode|ios_base::out
. Если открытие файла закончи-
лось неудачей, то вызывает функцию
setstate(failbit)
;
is_open
— возвращает значение
true
, если файл открыт, ина-
че —
false
;
close
— закрывает файл. Если файл успешно закрыт, то воз-
вращает указатель
this
, иначе — пустой указатель.
40.6.2. Шаблон класса
basic_ifstream
Шаблон класса
basic_ifstream<E, T>
имеет следующий интер-
фейс:
template <class E, class T = char_traits<E>>
class basic_ifstream : public basic_istream<E, T>
{
public:
// конструкторы
basic_ifstream();
explicit basic_ifstream(const char *s,
ios_base::openmode mode = ios_base::in);
// функции-члены
basic_filebuf<E, T> *rdbuf() const;
void open(const char *s,
ios_base::openmode mode = ios_base::in);
bool is_open() const;
void close();
};
Параметр
E
шаблона задает тип символов, которые являются
элементами потока, а параметр
T
определяет характеристики
этих символов. Подробно характеристики символов описаны
в
разд. 39.1
.
Конструктор по умолчанию создает буфер потока посредством
вызова конструктора
basic_filebuf<E, T>()
, а затем вызывает
конструктор базового класса
basic_ostream<E, T>
, передавая ему
в качестве аргумента указатель на буфер потока.