2017-11-02 10 views
0

방금 ​​C + + 학습을 시작했습니다. 나는 형식의 ICS 파일을 읽기 위해 노력하고 있어요 :C++에서 구분 기호 뒤에 파트를 구문 분석하는 방법에 대한 문제가 발생합니까?

BEGIN:VEVENT 
UID:2179:203860:1:002:1:person 
DTSTAMP:20170921T080000Z 
SUMMARY;LANGUAGE=en-ca:BIG CITY 
LOCATION:CANADA 
DTSTART;TZID=Eastern Standard Time:20170914T183000 
DTEND;TZID=Eastern Standard Time:20170914T203000 
RRULE:FREQ=WEEKLY;UNTIL=20171201T235959;BYDAY=TH 
CLASS:PUBLIC 
PRIORITY:5 
TRANSP:OPAQUE 
STATUS:CONFIRMED 
SEQUENCE:0 
END:VEVENT 

내가 각 행을 읽은했고, 특정 구분 기호를 찾으 후 일부 권리를 얻고, 벡터로 밀어 문자열을 호출 . 이 출력은해야합니까

void SimpleCalendar::initialize(){ 
    int counter = 0; 
    string getLine; 
    ifstream readFile; 
    readFile.open("cal.ics"); 

if(readFile.fail()){ 
    throw FileException("Error! Cannot open the file."); 
} 

while(!readFile.eof()){ 
    readFile >> getLine; 
    size_t summ = getLine.find("SUMMARY;LANGUAGE=en-ca:"); 
    if (summ != string::npos){ 
     course.push_back(getLine.substr(summ+1)); 
     cout << course[counter] << endl; 
     counter++; 
    } 
} 

: 은 여기에 파일을 읽어 내 방법입니다 BIG CITY은 대신 내가 받기 ->SUMMARY;LANGUAGE=en-ca:BIG

+1

[이유 '를 while (! readFile.eof())'잘못되었습니다.] (https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Barmar

답변

3
>>를 사용하지 마십시오, 그것은 단지 하나의 단어를 읽어

(종료 공백 포함). 전체 라인을 읽으려면 getline()을 사용하십시오.

find()은 끝이 아닌 시작 부분의 색인을 반환합니다. substr()에 전화 할 때 건너 뛸 문자열의 길이를 추가해야합니다.

while (readFile.getline(getLine)) { 
    size_t summ = getLine.find("SUMMARY;LANGUAGE=en-ca:"); 
    if (summ != string::npos){ 
     course.push_back(getLine.substr(summ + sizeof "SUMMARY;LANGUAGE=en-ca:")); 
     cout << course[counter] << '\n'; 
     counter++; 
    } 
} 
+0

고마워요! "LOCATION :"과 같이 다음 줄을 어떻게 얻을 것인지 확인하고 싶습니다. 다른 구분 기호로 다른 if 문을 수행해야합니까? – user3344484

+0

예, 좀 더 일반적인 것을 디자인 할 수도 있습니다. 행에서 첫 번째':'또는';'를 찾듯이 전에 그 단어를 가져온 다음'/ if else if /'문자열을 사용하여 다른 접두사 문자열에 대해 테스트하십시오. – Barmar