Я пытаюсь разобрать дату, которая содержит одну цифру для каждого месяца и дня. Следующие разборы правильно:
std::istringstream ss("2015/05/01");
std::tm tmb = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ss >> std::get_time(&tmb, "%Y/%m/%d");
Но когда я пытаюсь разобрать
std::istringstream ss("2015/5/1");
Я получаю состояние сбоя в потоке, и время не было правильно считано в структуру. Есть ли чистый (и эффективный) способ, которым я могу разобрать это?
РЕДАКТИРОВАТЬ: я разрабатываю на Ubuntu 12.04 и компилятор g ++ 5.4.1.
Вы не говорите, на какой платформе вы находитесь.
Я бы посоветовал не писать свой собственный парсер. Посмотрите на strftime / strptime или Boost.Date_Time.
Вы могли бы использовать Портативная, бесплатная библиотека даты / времени Говарда Хиннанта с открытым исходным кодом. Вот как будет выглядеть программа:
#include "date.h"#include <cassert>
#include <sstream>
int
main()
{
date::year_month_day ymd;
std::istringstream ss{"2015/5/1"};
ss >> date::parse("%Y/%m/%d", ymd);
assert(!ss.fail());
using namespace date::literals;
assert(ymd == may/1/2015);
}
Вы можете конвертировать year_month_day
в std:tm
если ты действительно хочешь (вот как), но если вам не нужно общаться с каким-то клиентом, который действительно нуждается в tm
Нет причин для.
"date.h"
это только заголовок, поэтому он прост в установке, полностью документирован, прост в использовании и построен на C ++ 11 <chrono>
, так что это очень безопасно для типов.
Вот ссылка на wandbox, показывающая, что она запускает вышеуказанную программу с gcc 5.4.0.