2011-02-07 6 views
1

私はプログラムを書いているので、ファイルから日付を読み込む必要があります。日付は年、月、日です。どのようにすべての日付情報を読む必要がありますか?いくつかの例を挙げることができますか?C + +での文字列[Anjuta IDEを使用]

+0

日付はどのような形式ですか? – robert

+0

日付書式: "YYYY.mm.dd" – gedO

答えて

1

まず、値を保持する構造体が必要です。標準的な構造体tmがありますが、これにはメンバーがたくさんあり、その中のいくつかは他のメンバーに依存しており、昨日が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; 
} 

、エラー条件が関数の戻り値によって通知されるだけでなく、構造体日の内容

これが役に立ちます。

+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

私の問題は、この機能を使用するには鍬が分かっていました。今それは正常に動作します。ありがとうございます:) – gedO

0

「。」で文字列を分割することもできます。データを変数に入れます(たとえば、配列など)。
次に、それらを組み合わせて独自の形式と文字列を作成できます。

1

あなたが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>が必要で、2006年に追加されたtime_getにいくつかの追加が必要です。

+0

このライブラリは廃止されました。それはに置き換えられました。 – ntg

0

ブーストの使用は答えです。

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; 
} 
関連する問題