Разбор даты в C ++ с использованием одной цифры

Я пытаюсь разобрать дату, которая содержит одну цифру для каждого месяца и дня. Следующие разборы правильно:

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.

1

Решение

Вы не говорите, на какой платформе вы находитесь.

Я бы посоветовал не писать свой собственный парсер. Посмотрите на strftime / strptime или Boost.Date_Time.

0

Другие решения

Вы могли бы использовать Портативная, бесплатная библиотека даты / времени Говарда Хиннанта с открытым исходным кодом. Вот как будет выглядеть программа:

#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.

0

По вопросам рекламы [email protected]