30 Input/output library [input.output]

30.5 Iostreams base classes [iostreams.base]

30.5.3 Class ios_­base [ios.base]

namespace std {
  class ios_base {
  public:
    class failure; // see below

    // [ios::fmtflags], fmtflags
    using fmtflags = T1;
    static constexpr fmtflags boolalpha = unspecified;
    static constexpr fmtflags dec = unspecified;
    static constexpr fmtflags fixed = unspecified;
    static constexpr fmtflags hex = unspecified;
    static constexpr fmtflags internal = unspecified;
    static constexpr fmtflags left = unspecified;
    static constexpr fmtflags oct = unspecified;
    static constexpr fmtflags right = unspecified;
    static constexpr fmtflags scientific = unspecified;
    static constexpr fmtflags showbase = unspecified;
    static constexpr fmtflags showpoint = unspecified;
    static constexpr fmtflags showpos = unspecified;
    static constexpr fmtflags skipws = unspecified;
    static constexpr fmtflags unitbuf = unspecified;
    static constexpr fmtflags uppercase = unspecified;
    static constexpr fmtflags adjustfield = see below;
    static constexpr fmtflags basefield = see below;
    static constexpr fmtflags floatfield = see below;

    // [ios::iostate], iostate
    using iostate = T2;
    static constexpr iostate badbit = unspecified;
    static constexpr iostate eofbit = unspecified;
    static constexpr iostate failbit = unspecified;
    static constexpr iostate goodbit = see below;

    // [ios::openmode], openmode
    using openmode = T3;
    static constexpr openmode app = unspecified;
    static constexpr openmode ate = unspecified;
    static constexpr openmode binary = unspecified;
    static constexpr openmode in = unspecified;
    static constexpr openmode out = unspecified;
    static constexpr openmode trunc = unspecified;

    // [ios::seekdir], seekdir
    using seekdir = T4;
    static constexpr seekdir beg = unspecified;
    static constexpr seekdir cur = unspecified;
    static constexpr seekdir end = unspecified;

    class Init;

    // [fmtflags.state], fmtflags state
    fmtflags flags() const;
    fmtflags flags(fmtflags fmtfl);
    fmtflags setf(fmtflags fmtfl);
    fmtflags setf(fmtflags fmtfl, fmtflags mask);
    void unsetf(fmtflags mask);

    streamsize precision() const;
    streamsize precision(streamsize prec);
    streamsize width() const;
    streamsize width(streamsize wide);

    // [ios.base.locales], locales
    locale imbue(const locale& loc);
    locale getloc() const;

    // [ios.base.storage], storage
    static int xalloc();
    long&  iword(int index);
    void*& pword(int index);

    // destructor:
    virtual ~ios_base();

    // [ios.base.callback], callbacks;
    enum event { erase_event, imbue_event, copyfmt_event };
    using event_callback = void (*)(event, ios_base&, int index);
    void register_callback(event_callback fn, int index);

    ios_base(const ios_base&) = delete;
    ios_base& operator=(const ios_base&) = delete;

    static bool sync_with_stdio(bool sync = true);

  protected:
    ios_base();

  private:
    static int index;  // exposition only
    long*  iarray;     // exposition only
    void** parray;     // exposition only
  };
}

ios_­base определяет несколько типов членов:

  • типfailure, определяемый либо как производный класс, system_­error либо как синоним класса, производного отsystem_­error;

  • классInit;

  • три типа Bitmask,fmtflags,iostate, иopenmode;

  • перечислимого типа,seekdir.

Он поддерживает несколько типов данных:

  • информация о состоянии, отражающая целостность буфера потока;

  • управляющая информация, которая влияет на то, как интерпретировать (форматировать) входные последовательности и как генерировать (форматировать) выходные последовательности;

  • дополнительная информация, которая хранится программой для личного пользования.

[ Note: Для демонстрации поддерживаемые данные представлены здесь как:

  • static int index, определяет следующий доступный уникальный индекс для массивов целых чисел или указателей, поддерживаемых для частного использования программой, инициализированных неопределенным значением;

  • long* iarray, указывает на первый элементlong массива произвольной длины, предназначенного для частного использования программой;

  • void** parray, указывает на первый элемент массива указателей произвольной длины, предназначенного для частного использования программой.

end note]

30.5.3.1 Types [ios.types]

30.5.3.1.1 Class ios_­base​::​failure [ios::failure]

namespace std {
  class ios_base::failure : public system_error {
  public:
    explicit failure(const string& msg, const error_code& ec = io_errc::stream);
    explicit failure(const char* msg, const error_code& ec = io_errc::stream);
  };
}

Реализацию разрешено определятьios_­base​::​failure как синоним класса с функциональностью, эквивалентной классу,ios_­base​::​failure показанному в этом подпункте. [ Note: Когдаios_­base​::​failure является синонимом другого типа, он должен предоставлять вложенный типfailureдля имитации имени внедренного класса. ] Класс определяет базовый класс для типов всех объектов, созданных как исключения функциями в библиотеке iostreams, чтобы сообщать об ошибках, обнаруженных во время операций с буфером потока.end notefailure

Приios_­base​::​failure создании исключений реализации должны предоставлять значения,ec которые определяют конкретную причину сбоя. [ Note: Ошибки, возникающие в операционной системе, обычно сообщаются как system_­category() ошибки со значением ошибки, равным номеру ошибки, сообщаемому операционной системой. Об ошибках, возникающих в библиотеке потоков, обычно сообщается какerror_­code(io_­errc​::​stream, iostream_­category()). ]end note

explicit failure(const string& msg, const error_code& ec = io_errc::stream);

Effects: Создает объект класса failure , создавая базовый класс с помощьюmsg иec.

explicit failure(const char* msg, const error_code& ec = io_errc::stream);

Effects: Создает объект класса failure , создавая базовый класс с помощьюmsg иec.

30.5.3.1.2 Type ios_­base​::​fmtflags [ios::fmtflags]

using fmtflags = T1;

Тип fmtflags - этоbitmask type. Установка его элементов имеет эффекты, указанные в Табл107.

Таблица107 -fmtflags эффекты
ЭлементЭффект (ы), если установлен
boolalpha вставить и извлечьbool тип в алфавитном формате
dec преобразует целочисленный ввод или генерирует целочисленный вывод в десятичной системе счисления
fixed генерировать вывод с плавающей запятой в нотации с фиксированной запятой
hex преобразует целочисленный ввод или генерирует целочисленный вывод в шестнадцатеричной системе счисления
internal добавляет символы заливки в обозначенную внутреннюю точку в определенном сгенерированном выводе или идентично,right если такая точка не обозначена
left добавляет символы заливки справа (конечные позиции) определенного сгенерированного вывода
oct преобразует целочисленный ввод или генерирует целочисленный вывод в восьмеричной системе счисления
right добавляет символы заполнения слева (начальные позиции) определенного сгенерированного вывода
scientific генерирует вывод с плавающей запятой в экспоненциальной нотации
showbase генерирует префикс, указывающий числовую основу сгенерированного целочисленного вывода
showpoint безоговорочно генерирует символ десятичной точки в сгенерированном выводе с плавающей запятой
showpos генерирует+ знак в неотрицательном сгенерированном числовом выводе
skipws пропускает начальные пробелы перед определенными операциями ввода
unitbuf сбрасывает вывод после каждой операции вывода
uppercase заменяет определенные строчные буквы их эквивалентами в верхнем регистре в сгенерированном выводе

Тип fmtflags также определяет константы, указанные в Табл108.

Таблица108 -fmtflags константы
ПостоянныйДопустимые значения
adjustfield left | right | internal
basefield dec | oct | hex
floatfield scientific | fixed

30.5.3.1.3 Type ios_­base​::​iostate [ios::iostate]

using iostate = T2;

Типом iostate является abitmask type , содержащий элементы, указанные в таблице109.

Таблица109 -iostate эффекты
ЭлементЭффект (ы), если установлен
badbit указывает на потерю целостности во входной или выходной последовательности (например, на неисправимую ошибку чтения из файла);
eofbit указывает, что операция ввода достигла конца входной последовательности;
failbit указывает, что операция ввода не смогла прочитать ожидаемые символы или что операция вывода не смогла сгенерировать желаемые символы.

Тип iostate также определяет константу:

  • goodbit, нулевое значение.

30.5.3.1.4 Type ios_­base​::​openmode [ios::openmode]

using openmode = T3;

Тип openmode - этоbitmask type. Он содержит элементы, указанные в таблице110.

Таблица110 -openmode эффекты
ЭлементЭффект (ы), если установлен
app стремиться закончить перед каждой записью
ate открывать и стремиться к завершению сразу после открытия
binary выполнять ввод и вывод в двоичном режиме (в отличие от текстового режима)
in открыт для ввода
out открыт для вывода
trunc обрезать существующий поток при открытии

30.5.3.1.5 Type ios_­base​::​seekdir [ios::seekdir]

using seekdir = T4;

Тип seekdir - это объектenumerated type , содержащий элементы, указанные в таблице111.

Таблица111 -seekdir эффекты
ЭлементИмея в виду
beg запросить поиск (для последующего ввода или вывода) относительно начала потока
cur запросить поиск относительно текущей позиции в последовательности
end запросить поиск относительно текущего конца последовательности

30.5.3.1.6 Class ios_­base​::​Init [ios::Init]

namespace std {
  class ios_base::Init {
  public:
    Init();
    ~Init();
  private:
    static int init_cnt; // exposition only
  };
}

Класс Init описывает объект, конструкция которого обеспечивает создание восьми объектов, объявленных в <iostream> ([iostream.objects]), которые связывают буферы файловых потоков со стандартными потоками C, предусмотренными функциями, объявленными в <cstdio>.

Для демонстрации поддерживаемые данные представлены здесь как:

  • static int init_­cnt, подсчитывает количество вызовов конструктора и деструктора для класса Init, инициализированного нулем.

Init();

Effects: Создает объект класса Init. Формирует и инициализирует объектыcin,cout,cerr, clog,wcin,wcout,wcerr, и ,wclog если они еще не были построены и инициализируется.

~Init();

Effects: Уничтожает объект класса Init. Если нет других экземпляров класса все еще существует, звонки cout.flush(), cerr.flush(), clog.flush(), wcout.flush(), wcerr.flush(), wclog.flush().

30.5.3.2 ios_­base state functions [fmtflags.state]

fmtflags flags() const;

Returns: Информация управления форматом как для ввода, так и для вывода.

fmtflags flags(fmtflags fmtfl);

Postconditions: fmtfl == flags().

Returns: Предыдущее значение flags().

fmtflags setf(fmtflags fmtfl);

Effects: Наборыfmtfl в flags().

Returns: Предыдущее значение flags().

fmtflags setf(fmtflags fmtfl, fmtflags mask);

Effects: Очищаетmask в flags(), наборы fmtfl & mask в flags().

Returns: Предыдущее значение flags().

void unsetf(fmtflags mask);

Effects: Очищаетmask в flags().

streamsize precision() const;

Returns: Точность, генерируемая при определенных выходных преобразованиях.

streamsize precision(streamsize prec);

Postconditions: prec == precision().

Returns: Предыдущее значение precision().

streamsize width() const;

Returns: Минимальная ширина поля (количество символов), генерируемая при определенных преобразованиях вывода.

streamsize width(streamsize wide);

Postconditions: wide == width().

Returns: Предыдущее значение width().

30.5.3.3 ios_­base functions [ios.base.locales]

locale imbue(const locale& loc);

Effects: Вызывает каждую зарегистрированную пару обратного вызова (fn, index) ([ios.base.callback]) (*fn)(imbue_­event, *this, index) в такой момент, когда вызов ios_­base​::​getloc() изнутри fn возвращает новое значение локали loc.

Returns: Предыдущее значение getloc().

Postconditions: loc == getloc().

locale getloc() const;

Returns: Если языковой стандарт не был добавлен, копия глобального языкового стандарта C ++ locale(), действующая на момент создания. В противном случае возвращает встроенный языковой стандарт, который будет использоваться для выполнения операций ввода и вывода, зависящих от языкового стандарта.

30.5.3.4 ios_­base static members [ios.members.static]

bool sync_with_stdio(bool sync = true);

Returns: true если предыдущее состояниеstandard iostream objects было синхронизировано, в противном случае возвращается false. При первом вызове функция возвращается true.

Effects: Если какая-либо операция ввода или вывода произошла с использованием стандартных потоков до вызова, эффект определяется реализацией. В противном случае, вызванный сfalse аргументом, он позволяет стандартным потокам работать независимо от стандартных потоков C.

Когда стандартный объект iostreamstr находится synchronized со стандартным потоком stdiof, эффект вставки символа сc помощью

fputc(f, c);

такой же, как эффект

str.rdbuf()->sputc(c);

для любых последовательностей символов; эффект извлечения персонажа сc помощью

c = fgetc(f);

такой же, как эффект

c = str.rdbuf()->sbumpc();

для любых последовательностей символов; и эффект отодвигая персонажаc по

ungetc(c, f);

такой же, как эффект

str.rdbuf()->sputbackc(c);

для любой последовательности символов.292

Это означает, что операции над стандартным объектом iostream могут произвольно сочетаться с операциями над соответствующим потоком stdio. На практике синхронизация обычно означает, что стандартный объект iostream и стандартный объект stdio совместно используют буфер.

30.5.3.5 ios_­base storage functions [ios.base.storage]

static int xalloc();

Returns: index ++.

Remarks: Одновременный доступ к этой функции нескольких потоков не должен приводить к возникновению файла data race.

long& iword(int idx);

Effects: Еслиiarray - нулевой указатель, выделяет массив long неопределенного размера и сохраняет указатель на его первый элемент в iarray. Затем функция расширяет массив, на который указывает, по iarray мере необходимости, чтобы включить элемент iarray[idx]. Каждый вновь выделенный элемент массива инициализируется нулем. Возвращенная ссылка недействительна после любых других операций с объектом.293 Однако значение указанного хранилища сохраняется, так что до следующего вызова copyfmtвызов iword с тем же индексом дает еще одну ссылку на то же значение. Если функция не работает294 и *this является подобъектом базового класса basic_­ios<> объекта или подобъекта, эффект эквивалентен вызову basic_­ios<>​::​setstate(badbit) производного объекта (который может вызвать ошибку failure).

Returns: Об успехе iarray[idx]. В случае сбоя действительный long& инициализируется значением 0.

void*& pword(int idx);

Effects: Еслиparray - нулевой указатель, выделяет массив указателей наvoid неопределенный размер и сохраняет указатель на свой первый элемент вparray. Затем функция расширяет массив, на который указывает, поparray мере необходимости, чтобы включить элемент parray[idx]. Каждый вновь выделенный элемент массива инициализируется нулевым указателем. Возвращенная ссылка недействительна после любых других операций с объектом. Однако значение указанного хранилища сохраняется, так что до следующего вызова copyfmtвызов pword с тем же индексом дает еще одну ссылку на то же значение. Если функция не работает295 и *this является подобъектом базового класса basic_­ios<> объекта или подобъекта, эффект эквивалентен вызову basic_­ios<>​::​setstate(badbit) производного объекта (который может вызвать ошибку failure).

Returns: Об успехе parray[idx]. В случае ошибки действительный void*& инициализируется значением 0.

Remarks: После последующего обращения к pword(int) тому же объекту более раннее возвращаемое значение может быть недействительным.

Реализация может реализовать как целочисленный массив, на который указывает, такiarray и массив указателей, на который указывает parray как разреженные структуры данных, возможно, с одноэлементным кешем для каждой.

например, потому что он не может выделить место.

например, потому что он не может выделить место.

30.5.3.6 ios_­base callbacks [ios.base.callback]

void register_callback(event_callback fn, int index);

Effects: Регистрирует пару (fn, index) таким образом, чтобы во время вызовов imbue() ([ios.base.locales]) copyfmt(), или ~ios_­base() ([ios.base.cons]) функция fn вызывалась с аргументом index. Зарегистрированные функции вызываются при возникновении события в порядке, обратном регистрации. Функции, зарегистрированные при активной функции обратного вызова, не вызываются до следующего события.

Requires: Функция fn не должна вызывать исключений.

Remarks: Идентичные пары не объединяются. Функция, зарегистрированная дважды, будет вызываться дважды.

30.5.3.7 ios_­base constructors/destructor [ios.base.cons]

ios_base();

Effects: ios_­base После построения каждый член имеет неопределенное значение. Члены объекта должны быть инициализированы вызовом basic_­ios​::​init перед первым использованием объекта или перед его уничтожением, в зависимости от того, что произойдет раньше; в противном случае поведение не определено.

~ios_base();

Effects: Уничтожает объект класса ios_­base. Вызывает каждую зарегистрированную пару обратного вызова (fn, index) ([ios.base.callback]) как (*fn)(​erase_­event, *this, index) в то время, когда любая ios_­base функция-член, вызываемая изнутри, fn имеет четко определенные результаты.