Шаг 463.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Основные потоковые классы и объекты. Подробные определения классов

    На этом шаге мы приведем более подробные определения классов.

    Как и все шаблонные классы библиотеки IOStream, шаблон basic_ios<> параметризуется по двум аргументам, а его определение выглядит так:

  namespace std {
    template <class charT,
                    class traits = char_traits<charT> >
    class basic_ios; 
  }

    В аргументах шаблона передается тип символов, используемый потоковыми классами, и класс с описанием трактовок этого типа.

    В частности, трактовки класса определяют признак конца файла и способы копирования/перемещения ряда символов.


   Замечание. Термин конец файла в данном контексте означает конец входных данных, что соответствует интерпретации константы EOF в языке С.

    Как правило, тип символов ассоциируется с определенным набором трактовок, поэтому будет вполне логично определить шаблонный класс, специализируемый для конкретных типов символов.

    Соответственно по умолчанию используется класс трактовок char_traits<charT>, где charT - тип символов. Стандартная библиотека C++ содержит специализации шаблона char_traits для типов символов char и wchar_t.

    Существуют две специализации класса basic_ios<> для двух самых распространенных типов символов:

  namespace std {
    typedef basic_ios<char> ios; 
    typedef basic_ios<wchar_t> wios;
  }

    Тип ios соответствует базовому классу "старой" библиотеки IOStream, разработанной AT&T, и может использоваться для обеспечения совместимости со старыми программами C++.

    Класс потокового буфера, используемый basic_ios, определяется аналогично:

  namespace std {
    template <class charT,
        class traits = char_traits<charT> >
    class basic_streambuf;
    typedef basic streambuf<char> streambuf;
    typedef basic_streambuf<wchar_t> wstreambuf; 
  }

    Конечно, шаблоны basic_istream<>, basic_ostream<> и basic_iostream<> тоже параметризуются по типу символов и классу трактовок:

  namespace std {
    template <class charT,
        class traits = char_traits<charT> > 
    class basic_istream;

  template <class charT,
        class traits = char_traits<charT> > 
  class basic_ostream;

  template <class charT,
        class traits = char_traits<charT> > 
  class basic_iostream; 
  }

    По аналогии с другими классами также существуют специализации для двух важнейший типов символов:

  namespace std {
    typedef basic_istream<char>   istream; 
    typedef basic_istream<wchar_t> wistream;

    typedef basic_istream<char>  ostream; 
    typedef basic_istream<wchar_t> wostream;
 
    typedef basic_istream<char>  iostream; 
    typedef basic_istream<wchar_t> wiostream; 
  }

    В западном полушарии обычно используются типы istream и ostream, в целом совместимые со "старыми" потоковыми классами AT&T.

    Классы istream_withassign, ostream_withassign и iostream_withassign, включенные в некоторые старые потоковые библиотеки (и производные от istream, ostream и iostream соответственно), не поддерживаются стандартом. Их функциональность реализуется другими средствами.

    Также в библиотеку IOStream входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками.

    На следующем шаге мы рассмотрим глобальные потоковые объекты.




Предыдущий шаг Содержание Следующий шаг