Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4229

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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>

  разделяет  один  буфер  для  ввода  и  вывода 

данных. 


background image

Часть 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


background image

Глава 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>

 соответственно. Буфер по-

тока  создается  самим  потоком  при  его  инициализации.  Так  как 
прикладные  программы  редко  работают  с  буфером  потока  на-
прямую, то буферы потоков рассматриваться не будут. 


background image

Часть 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>

 выполняют 

следующие действия: 


background image

Глава 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>

, передавая ему 

в качестве аргумента указатель на буфер потока. 


Смотрите также файлы