อ่านสตริงจากอินพุตจนถึง EOF

ฉันอ่านโพสต์มากมายใน SO แล้ว แต่ยังไม่สามารถแก้ไขปัญหาได้
ฉันต้องอ่าน:

ข้อความ
รูปแบบ1
รูปแบบ2

จากอินพุตมาตรฐาน มี text and patterns มากมาย .
รหัส :

string t,p1,p2;
while(getline(cin, t))
{
    cin>>p1;
    cin>>p2;

    cout<<"text is = "<<t<<"\np1 is = "<<p1<<"\np2 is = "<<p2<<endl;
}  

ไฟล์อินพุต :

ค้อน
แฮม
mer
gogoa
ไป
z
gogoa
g
o

เอาต์พุต :

ข้อความคือ = ค้อน
p1 คือ = แฮม
p2 คือ = mer
ข้อความคือ =
p1 คือ = gogoa
p2 คือ = go
ข้อความคือ =
p1 คือ = z
p2 คือ = gogoa
ข้อความคือ =
p1 คือ = g
p2 คือ = o


person Aseem Goyal    schedule 30.03.2014    source แหล่งที่มา


คำตอบ (3)


หากคุณใช้ getline หลัง cin >> something คุณจะต้องล้างบรรทัดใหม่ออกจากบัฟเฟอร์ในระหว่างนั้น

#include <iostream>
#include <limits>
using namespace std;

int main() {
    string t,p1,p2;
    while(getline(cin, t))
    {
        cin>>p1;
        cin>>p2;

        cout<<"text is = "<<t<<"\np1 is = "<<p1<<"\np2 is = "<<p2<<endl;

        cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); // Dump everything until newline
    }
    return 0;
}

http://ideone.com/b7Xj6o

เพิ่มเติมที่นี่: https://stackoverflow.com/a/10553849/1938163

person Marco A.    schedule 30.03.2014

คุณสามารถลองสิ่งนี้:

#include <vector>

vector<string> vs;
int i;
while(getline(cin, t)) {
    vs.push_back(t);
}

for(i = 0; i < (vs.size / 3); i++) {
    cout <<"text is " << vs[0 + (3*i)] << "\np1 is " << vs[1 + (3*i)] << "\np2 is " << vs[2 + (3*i) << endl;
}
person Max Langerak    schedule 30.03.2014

ลองสิ่งนี้:

string t,p1,p2;
while(getline(cin, t))
{
    cin>>p1;
    cin>>p2;

    getchar();  //removes '\n' from stdin

    cout<<"text is = "<<t<<"\np1 is = "<<p1<<"\np2 is = "<<p2<<endl;
} 
person Rikayan Bandyopadhyay    schedule 30.03.2014