Строка на сегодняшний день в C ++ [Использование Anjuta IDE] - PullRequest
1 голос
/ 07 февраля 2011

Я пишу программу, и мне нужно прочитать дату из файла. По дате это год, месяц и день. Как мне нужно прочитать всю информацию о дате? Можете привести несколько примеров?

Ответы [ 5 ]

1 голос
/ 02 апреля 2011

Если у вас есть C ++ 0x std :: lib (не обязательно слишком новый), вот бесплатное, простое и небольшое решение для библиотеки (1 исходный код, 1 заголовок):

http://howardhinnant.github.io/date.html

Вот пример использования:

#include "date.h"
#include <iostream>
#include <sstream>

int main()
{
    using namespace gregorian;
    date d;
    std::istringstream in("2011.02.07");
    in >> date_fmt("%Y.%m.%d") >> d;
    if (in.fail())
        std::cout << "failed\n";
    else
        std::cout << date_fmt("%A %B %e, %Y") << d << '\n';
}

Выход:

Monday February  7, 2011

Синтаксис следует из функции C strftime. А для библиотеки дат требуется заголовок C ++ 0x <cstdint> и некоторые дополнения к time_get, сделанные в 2006 году.

1 голос
/ 07 февраля 2011

Во-первых, вам, вероятно, понадобится структура для хранения значений. Существует стандартная структура, тм, но в ней много членов, некоторые из которых зависят от других, и было бы странно, если бы yday не соответствовал wday и mday.

struct Date {
    int year;
    int month;
    int day;
};

Тогда вам нужна функция, способная считывать данные в структуру. Сначала вам нужно открыть файл, прочитать первую строку и обработать его. Для этого вы можете использовать ifstream, который является стандартным классом в C ++ для чтения файлов.

std::ifstream f( fileName.c_str() );

Затем вам нужно прочитать строку, в которой хранится дата. Так как это упражнение, я предположил, что это было первым. getline() читает целую строку из ввода и сохраняет ее в ранее созданной строке.

std::string line;
std::getline( f, line );

Наконец, вы должны обработать эту строку. Для этого есть разные способы, но, вероятно, наиболее удобный в C ++ - это использовать потоки, связанные со строками, и читать каждое поле по его типу.

 std::istringstream str( line );

 str >> date.year
     >> firstDot
     >> date.month
     >> lastDot
     >> date.day
;

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

if ( firstDot != '.'
  || lastDot != '.' )
{
    date.year = date.month = date.day = -1;
}

Вот и вся функция:

bool readDate(const std::string &fileName, Date &date)
{
    char firstDot;
    char lastDot;
    std::ifstream f( fileName.c_str() );
    bool toret = false;

    date .year = date.month = date.day = -1;

    if ( f.is_open() ) {
        std::string line;

        // Read line containing the date
        std::getline( f, line );

        //  Chk string
        std::istringstream str( line );

        str >> date.year
             >> firstDot
             >> date.month
             >> lastDot
             >> date.day
        ;

        if ( firstDot != '.'
           || lastDot != '.' )
        {
            date.year = date.month = date.day = -1;
        }
        else toret = true;
    }

    return toret;
}

Как видите, состояние ошибки сигнализируется возвращаемым значением функции, а также содержимым struct Date .

Надеюсь, это поможет.

0 голосов
/ 08 февраля 2013

Использование Boost - ответ.

Этот вопрос похож и имеет действительно хороший ответ, хотя и не совсем на вашу проблему.

#include <fstream>
#include <iostream>
#include <string>
#include <boost/date_time.hpp>

using std::cout;
using std::cin;
using std::endl;
using std::string;
namespace bt = boost::posix_time;

int main()
{
    string dd=" 12 December 2011 15:00:42";
    //string dd="December 2011 15:00:42";
    cout<<dd<<endl;
    std::stringstream time1is(dd);
    std::locale dForm = std::locale(std::locale::classic(),new bt::time_input_facet("%d %B %Y %H:%M:%S"));//12 December 2011 15:00:42

    time1is.imbue(dForm);
    bt::ptime t1;
    if ((time1is>>t1).fail()) {
        std::cerr<<"error while parsing  "<<dd<<std::endl;
    }else{
        std::cerr<<"success!!  "<<dd<<std::endl;
    }
    cout<<t1<<endl;

    }

    //char c;  cin >> c;
    return 0;
}
0 голосов
/ 07 февраля 2011

Вы также можете разделить строку с помощью «.» символ и поместить данные в переменные (например, может быть массивом).
Затем вы можете создать свой собственный формат и строку, комбинируя их.

0 голосов
/ 07 февраля 2011

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

struct tm tm;
time_t t;
strptime("%Y:%m:%d", &tm);
printf("year: %d; month: %d; day: %d;\n",
    tm.tm_year, tm.tm_mon, tm.tm_mday);
t = mktime(&tm);
...