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 ]
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 note failure
При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);
explicit failure(const char* msg, const error_code& ec = io_errc::stream);
using fmtflags = T1;
Тип fmtflags - этоbitmask type. Установка его элементов имеет эффекты, указанные в Табл107.
Элемент | Эффект (ы), если установлен |
boolalpha | вставить и извлечьbool тип в алфавитном формате |
dec | преобразует целочисленный ввод или генерирует целочисленный вывод в десятичной системе счисления |
fixed | генерировать вывод с плавающей запятой в нотации с фиксированной запятой |
hex | преобразует целочисленный ввод или генерирует целочисленный вывод в шестнадцатеричной системе счисления |
internal | добавляет символы заливки в обозначенную внутреннюю точку в определенном сгенерированном выводе или идентично,right если такая точка не обозначена |
left | добавляет символы заливки справа (конечные позиции) определенного сгенерированного вывода |
oct | преобразует целочисленный ввод или генерирует целочисленный вывод в восьмеричной системе счисления |
right | добавляет символы заполнения слева (начальные позиции) определенного сгенерированного вывода |
scientific | генерирует вывод с плавающей запятой в экспоненциальной нотации |
showbase | генерирует префикс, указывающий числовую основу сгенерированного целочисленного вывода |
showpoint | безоговорочно генерирует символ десятичной точки в сгенерированном выводе с плавающей запятой |
showpos | генерирует+ знак в неотрицательном сгенерированном числовом выводе |
skipws | пропускает начальные пробелы перед определенными операциями ввода |
unitbuf | сбрасывает вывод после каждой операции вывода |
uppercase | заменяет определенные строчные буквы их эквивалентами в верхнем регистре в сгенерированном выводе |
using iostate = T2;
Типом iostate является abitmask type , содержащий элементы, указанные в таблице109.
Элемент | Эффект (ы), если установлен |
badbit | указывает на потерю целостности во входной или выходной последовательности (например, на неисправимую ошибку чтения из файла); |
eofbit | указывает, что операция ввода достигла конца входной последовательности; |
failbit | указывает, что операция ввода не смогла прочитать ожидаемые символы или что операция вывода не смогла сгенерировать желаемые символы. |
using openmode = T3;
Тип openmode - этоbitmask type. Он содержит элементы, указанные в таблице110.
Элемент | Эффект (ы), если установлен |
app | стремиться закончить перед каждой записью |
ate | открывать и стремиться к завершению сразу после открытия |
binary | выполнять ввод и вывод в двоичном режиме (в отличие от текстового режима) |
in | открыт для ввода |
out | открыт для вывода |
trunc | обрезать существующий поток при открытии |
using seekdir = T4;
Тип seekdir - это объектenumerated type , содержащий элементы, указанные в таблице111.
Элемент | Имея в виду |
beg | запросить поиск (для последующего ввода или вывода) относительно начала потока |
cur | запросить поиск относительно текущей позиции в последовательности |
end | запросить поиск относительно текущего конца последовательности |
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();
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;
Returns: Минимальная ширина поля (количество символов), генерируемая при определенных преобразованиях вывода.
streamsize width(streamsize wide);
locale imbue(const locale& loc);
Effects: Вызывает каждую зарегистрированную пару обратного вызова (fn, index) ([ios.base.callback]) (*fn)(imbue_event, *this, index) в такой момент, когда вызов ios_base::getloc() изнутри fn возвращает новое значение локали loc.
locale getloc() const;
bool sync_with_stdio(bool sync = true);
Returns: true если предыдущее состояниеstandard iostream objects было синхронизировано, в противном случае возвращается false. При первом вызове функция возвращается true.
Когда стандартный объект 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 совместно используют буфер.
static int xalloc();
long& iword(int idx);
Effects: Еслиiarray - нулевой указатель, выделяет массив long неопределенного размера и сохраняет указатель на его первый элемент в iarray. Затем функция расширяет массив, на который указывает, по iarray мере необходимости, чтобы включить элемент iarray[idx]. Каждый вновь выделенный элемент массива инициализируется нулем. Возвращенная ссылка недействительна после любых других операций с объектом.293 Однако значение указанного хранилища сохраняется, так что до следующего вызова copyfmtвызов iword с тем же индексом дает еще одну ссылку на то же значение. Если функция не работает294 и *this является подобъектом базового класса basic_ios<> объекта или подобъекта, эффект эквивалентен вызову basic_ios<>::setstate(badbit) производного объекта (который может вызвать ошибку failure).
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 как разреженные структуры данных, возможно, с одноэлементным кешем для каждой.
например, потому что он не может выделить место.
например, потому что он не может выделить место.
void register_callback(event_callback fn, int index);
Effects: Регистрирует пару (fn, index) таким образом, чтобы во время вызовов imbue() ([ios.base.locales]) copyfmt(), или ~ios_base() ([ios.base.cons]) функция fn вызывалась с аргументом index. Зарегистрированные функции вызываются при возникновении события в порядке, обратном регистрации. Функции, зарегистрированные при активной функции обратного вызова, не вызываются до следующего события.
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 имеет четко определенные результаты.