プログラムを書いているのですが、ファイルから日付を読み取る必要があります。日付は年、月、日です。すべての日付情報をどのように読む必要がありますか?いくつか例を挙げていただけますか?
5 に答える
まず、値を保持するための構造体がおそらく必要になります。標準の構造体tmがありますが、これには多くのメンバーがあり、一部は他の構造体に依存しているため、ydayがwdayおよびmdayに準拠していないと混乱します。
struct Date {
int year;
int month;
int day;
};
次に、データを構造体に読み込むことができる関数が必要です。まず、ファイルを開き、最初の行を読んで、それを処理する必要があります。これを実現するために、ファイルを読み取るためのC++の標準クラスであるifstreamを使用できます。
std::ifstream f( fileName.c_str() );
次に、日付が保存されている行を読み取る必要があります。エクササイズなので、初めてだと思いました。getline()
入力から1行全体を読み取り、以前に作成した文字列に保存します。
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;
}
ご覧のとおり、エラー状態は、関数の戻り値と構造体の Dateの内容によって示されます。
お役に立てれば。
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ヘッダーと2006年<cstdint>
に行われたいくつかの追加が必要です。time_get
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);
「。」で文字列を分割することもできます。文字とデータを変数に入れます(たとえば、配列の場合があります)。
次に、それらを組み合わせて独自のフォーマットと文字列を作成できます。
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;
}