2011-02-07 2 views
1

나는 프로그램을 쓰고있어 파일에서 날짜를 읽을 필요가있다. 날짜는 년, 월, 일입니다. 어떻게 모든 날짜 정보를 읽어야합니까 ?? 몇 가지 예를 들려 주시겠습니까 ??C + +에서 날짜 문자열 [Anjuta IDE 사용]

+0

날짜는 어떤 형식입니까? – robert

+0

날짜 형식 : "YYYY.mm.dd" – gedO

답변

1

먼저 구조체에 값을 저장해야합니다. 표준 구조체 인 tm이 있지만이 멤버에는 멤버가 많으며 일부 멤버는 다른 멤버에 따라 다르며 yday가 wday 및 mday와 일치하지 않을 경우 혼란 스러울 수 있습니다.

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

그런 다음 구조에 데이터를 읽을 수있는 기능이 필요합니다. 먼저 파일을 열고 첫 번째 줄을 읽고 처리해야합니다. 이를 위해 파일을 읽는 C++의 표준 클래스 인 ifstream을 사용할 수 있습니다.

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

그런 다음 날짜가 저장된 행을 읽어야합니다. 그것이 exercie이기 때문에, 나는 그것이 처음이었다고 생각했다. 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; 
} 

, 오류 조건이 함수의 반환 값에 의해 신호된다뿐만 아니라 구조체날짜의 내용.

희망이 도움이됩니다.

+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 *' 'char * strptime (const char *, const char *, tm *)'인수 '2'변환 할 수 없습니다." – gedO

+0

내 문제는 내가 ' 이 기능을 사용하려면 괭이를 알고 있어야합니다. 이제 제대로 작동합니다. 감사합니다 :) – gedO

0

"." 데이터를 변수에 넣습니다 (예 : 배열 일 수 있음).
그런 다음이를 결합하여 고유 한 형식과 문자열을 만들 수 있습니다.

1

당신은 C가있는 경우 + +0 표준 : 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 년에 만들어진 입니다.

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