2011-02-07 1 views
1

Я пишу программу, и мне нужно прочитать дату из файла. Дата - год, месяц и день. Как мне нужно читать всю информацию о дате? Можете ли вы привести несколько примеров?String to Date в C++ [Использование Anjuta IDE]

+0

В каком формате находится дата? – robert

+0

Формат даты: "YYYY.mm.dd" – gedO

ответ

1

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

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

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

Затем вам необходимо прочитать строку, в которой хранится дата. Поскольку это упражнение, я предположил, что это был первый. 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Даты.

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

+0

Спасибо за ваше время и объясняю все детали. Я дам попытку – gedO

0

Предлагаю использовать 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); 
+0

Действительно ли это хороший код ??? Я получаю ошибку "не может преобразовать 'tm *' в 'const char *' для аргумента '2' в 'char * strptime (const char *, const char *, tm *)'" – gedO

+0

Моя проблема заключалась в том, t знал мотыгу, чтобы использовать эту функцию. Теперь он работает нормально. Спасибо :) – gedO

0

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

1

Если у вас есть C++ 0x станд :: 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 

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

+0

Эта библиотека устарела. Он был заменен на . – ntg

0

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

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

#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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^