Локализация, передаваемая мною в функцию use_facet
getloc()
объявляется в ios_base
; она возвращает локализацию, связанную с потоком ввода или вывода. Наилучший подход — применение локализации, уже связанной с потоком, который вы собираетесь использовать для ввода или вывода данных; передача в качестве параметра или каким-либо другим способом имени локализации легко приводит к ошибкам.После создания объекта, который будет выполнять реальное чтение, мне необходимо обеспечить контроль состояния потока.
ios_base::iostate state = 0;
Сами фасеты не модифицируют состояние потока (например, устанавливая stream::failbit = 1
Реальное значение даты хранится в структуре tm
time_get
или time_put
.Считав дату, я могу проверить значение переменной, которую я использую для контроля состояния потока. Если это значение равно нулю или ios_base::eofbit
const time_put
use_facet
Это работает так же, как и предыдущая инстанциация класса time_get
printf
), которая будет печатать дату. «%x
» выводит дату, а «%X
» выводит время. Однако следует быть осторожным: в этом примере считывается только дата, поэтому члены структуры tm
, относящиеся ко времени, в этот момент имеют неопределенные значения.Теперь можно писать данные в поток вывода. Это делается следующим образом.
if (dateWriter.put(out, // Итератор потока вывода
out, // Лоток вывода
out.fill(), // Использовать символ заполнителя
&t, // Адрес структуры tm
&fmt[0], // Начало и конец строки форматирования
&fmt[2]
).failed()) // iter_type.failed() показывает, была или
// нет ошибка при записи
Функция time_put::put
time_put
. time_put::put
возвращает итератор ostreambuf_iterator
, который имеет функцию-член failed
, позволяющую зафиксировать ситуацию, когда итератор оказывается испорченным.get_date
get_date
Получает дату из потока, используя местные правила форматирования.
get_time
Получает время из потока, используя местные правила форматирования.
get_weekday
Получает название дня недели, например Monday, lundi, понедельник.
get_year
Получает год, используя местные правила форматирования.
Может быть полезной также функция-член date_order
time_base::dateorder
из
), которое определяет порядок месяца, дня и года в дате. Эта функция может помочь в тех случаях, когда вам приходится анализировать вывод даты, полученной функцией time_get::put
. Пример 13.5 показывает, как можно проверять порядок элементов, составляющих дату.#include
#include
#include
using namespace std;
int main() {
cin.imbue(locale("german"));
const time_get
use_facet
time_base::dateorder d = dateReader.date_order();
string s;
switch (d) {
case time_base::no_order:
s = "No order";
break;
case time_base::dmy:
s = "day/month/year";
break;