2017-11-02 7 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

関連する問題