Hỏi về stringstream trong C++

#include <iostream>
#include <sstream>

using namespace std;

int main()
{

    string s = "111\tsdfadsf\t238\tabc def\t10.25";
    
    stringstream stm(s);
    stringstream ss;
    string token;

    while (getline(stm, token, '\t')) {
        ss << token;
        //cout << token << endl;
    }
    cout << "=============" << endl;

    int ID;
    string name1;
    string name2;
    int amt1;
    double amt2;

    ss >> ID >> name1 >> amt1 >> name2 >> amt2;

    cout << "ID: "  << ID << endl;
    cout << "Name1: " << name1 << endl;
    cout << "Amount1: " << amt1 << endl;
    cout << "Name2: " << name2 << endl;
    cout << "Amount2: " << amt2 << endl;

    return 0;
}

Cách tách chuổi dùng stringstream, nhưng sao kết quả không lấy ra được số.
Mọi người xem giúp mình có sai chổ nào?

Kết quả đúng phải là như sau:

ID: 111
Name1: sdfadsf
Amount1: 238
Name2: abd def
Amount2: 10.25

cách dùng

ss << 100 << ' ' << 200;

int foo,bar;
ss >> foo >> bar;
while (getline(stm, token, '\t')) {
		ss << token;
		//cout << token << endl;
		ss << "\n";
	}

Cảm ơn Anh Tu,

Đã lấy được số 238 nhưng số 10.25 vẫn không lấy đc. và nó lại mất phần sau của chuổi thứ 2

chí có getline() mới lấy được dữ liệu có ký tự khoảng trắng, opeartor >> thì chụi rùi,

ss >> ID >> name1 >> amt1;// >> name2 >> amt2;
getline(ss, name2);
getline(ss, name2);
ss >> amt2;

Ngoài ra, c++ cung cấp std::noskipws và std::skipws để xử lý khoảng trắng, nhưng chỉ ở đầu dữ liệu thôi.
Bạn có thể tham khảo ở đây : http://www.cplusplus.com/reference/ios/noskipws/

1 Like

Thử thay cái ss bằng vector rồi pushback vào xem.

3 Likes
int main()
{
    string s = "111\tsdfadsf\t238\tabc def\t10.35";   

    stringstream stm(s);
    stringstream ss;
    string token;
    while (getline(stm, token, '\t')) {
        ss << token << "|";
        //cout << token << endl;
    }
    cout << "=============" << endl;

    int ID;
    string name1;
    string name2;
    int amt1;
    double amt2;

    ss >> ID;
    ss.ignore();
    getline(ss, name1, '|');
    ss >> amt1;
    ss.ignore();
    getline(ss, name2, '|');
    ss >> amt2;

    cout << "ID: "  << ID << endl;
    cout << "Name1: " << name1 << endl;
    cout << "Amount1: " << amt1 << endl;
    cout << "Name2: " << name2 << endl;
    cout << "Amount2: " << amt2 << endl;

    return 0;
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?