преобразование временной строки в длительность - PullRequest
1 голос
/ 07 июня 2010

В данный момент я пытаюсь прочитать в отформатированной временной шкале и создать длительность из этого.В настоящее время я пытаюсь использовать класс date_time time_duration для чтения и сохранения значения.

boost date_time предоставляет метод time_duration duration_from_string(std::string), который позволяет создавать time_duration из строки времени и принимать строки, отформатированные соответствующим образом ("[-]h[h][:mm][:ss][.fff]".).

Теперь этот метод работает нормально, если выиспользуйте правильно отформатированную строку времени.Однако, если вы отправите что-то недопустимое, например "ham_sandwich" или "100", вам будет возвращено недопустимое значение time_duration.В частности, если вы попытаетесь передать его в стандартный поток вывода, тогда произойдет утверждение.

Мой вопрос: кто-нибудь знает, как проверить достоверность повышения time_duration?и если нет, можете ли вы предложить другой метод чтения временной строки и получения от нее продолжительности?

Примечание: я попробовал очевидные методы тестирования, которые обеспечивает time_duration;is_not_a_date_time(), is_special() и т. Д., И они не понимают, что существует проблема.

Использование надстройки 1.38.0

Ответы [ 2 ]

5 голосов
/ 07 июня 2010

Из документации видно, что вы можете попробовать использовать операторы потоков (operator<<, operator>>); условия ошибки описаны в Дата и время ввода / вывода .

С другой стороны, я полагаю, вы могли бы проверить строку перед ее передачей. Сразу же, похоже, что этот конкретный метод не обрабатывает ошибки.

Edit: Я не уверен, что подумал бы проверить возвращаемое значение, как это, если бы не ответ Брайана, но для полноты вот полный пример, который принимает строку в качестве входных данных. Вы можете либо проверить возвращаемое значение, либо сделать так, чтобы оно выдало исключение (я полагаю, вы хотите перехватить std::ios_base_failure):

#include <iostream>
#include <sstream>
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>

using namespace std;
using namespace boost::posix_time;

int main(int argc, char **argv) {
    if (argc < 2) {
        cout << "Usage: " << argv[0] << " TIME_DURATION" << endl;
        return 2;
    }

    // No exception
    stringstream ss_noexcept(argv[1]);
    time_duration td1;
    if (ss_noexcept >> td1) {
        cout << "Valid time duration: " << td1 << endl;
    } else {
        cout << "Invalid time duration." << endl;
    }

    // Throws exception
    stringstream ss2;
    time_duration td2;
    ss2.exceptions(ios_base::failbit);
    ss2.str(argv[1]);
    try {
        ss2 >> td2;
        cout << "Time duration: " << td2 << endl;
    } catch (ios_base::failure e) {
        cout << "Invalid time duration (exception caught). what():\n"
                << e.what() << endl;
    }
}
2 голосов
/ 07 июня 2010

Используйте операторы потока.

time_duration td;
if (std::cin >> td)
{
   // it's valid
}
else
{
   // it isn't valid
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...