Я пишу программу, и мне нужно прочитать дату из файла. Дата - год, месяц и день. Как мне нужно читать всю информацию о дате? Можете ли вы привести несколько примеров?String to Date в C++ [Использование Anjuta IDE]
ответ
Во-первых, вам, вероятно, понадобится структура для хранения значений. Существует стандартная 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Даты.
Надеюсь, это поможет.
Спасибо за ваше время и объясняю все детали. Я дам попытку – gedO
Предлагаю использовать 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);
Действительно ли это хороший код ??? Я получаю ошибку "не может преобразовать 'tm *' в 'const char *' для аргумента '2' в 'char * strptime (const char *, const char *, tm *)'" – gedO
Моя проблема заключалась в том, t знал мотыгу, чтобы использовать эту функцию. Теперь он работает нормально. Спасибо :) – gedO
Вы также можете разделить строку на "." символа и помещать данные в переменные (может быть, например, массив).
Затем вы можете создать свой собственный формат и строку, объединив их.
Если у вас есть 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 году.
Эта библиотека устарела. Он был заменен на
Использование 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;
}
В каком формате находится дата? – robert
Формат даты: "YYYY.mm.dd" – gedO