Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.
Trong các bài học trước, chúng ta thường nhập và xuất dữ liệu sử dụng các đối tượng std::cout, std::cin hay các file streams. Những đối tượng này đóng vai trò là cấu nối trung gian giữa chương trình và các thiết bị, hoặc file. Bên cạnh đó, ngôn ngữ C++ còn định nghĩa thêm một số stream sử dụng cho các đối tượng std::string cho phép chúng ta sử dụng các toán tử (<<) và (>>) để làm việc với std::string. Cũng giống như istream và ostream, string stream cung cấp một buffer để chứa dữ liệu. Tuy nhiên, string stream không kết nối đến các Input/Output channel (như keyboard, monitor, file,…).
Stream for string
Sau đây là một số stream dùng cho std::string mà ngôn ngữ C++ cung cấp sẵn: istringstream (thừa kế từ istream), ostringstream (thừa kế từ ostream) và stringstream (thừa kế từ iostream).
Để sử dụng stringstream, chúng ta cần include thư viện sstream:
#include <sstream>
Có 2 cách để đưa dữ liệu vào buffer của một đối tượng stringstream:
-
Sử dụng insertion operator (<<):
std::stringstream ss; ss << "I'm learning" << " " << "C++ programming language" << std::endl;
-
Set value bằng phương thức str:
std::stringstream ss; ss.str("I'm learning C++ programming language\n");
Phương thức str còn được dùng để truy xuất dữ liệu trong một đối tượng stringstream (trả về kiểu std::string):
std::stringstream ss;
ss << "I'm learning" << " " << "C++ programming language" << std::endl;
std::cout << ss.str();
Để lấy dữ liệu từ buffer của đối tượng stringstream đưa vào std::string, chúng ta sử dụng insertion operator (>>):
std::stringstream os;
os << "12345 67.89"; // insert a string of numbers into the stream
std::string strValue;
os >> strValue;
std::string strValue2;
os >> strValue2;
// print the numbers separated by a dash
std::cout << strValue << " - " << strValue2 << std::endl;
Cũng tương tự như khi sử dụng insertion operator (>>) của đối tượng std::cin cho kiểu dữ liệu std::string, kí tự khoảng cách không được đọc vào std::string. Chúng ta có thể sử dụng đặc điểm này để thực hiện split string như sau:
std::string data = "Le Tran Dat";
std::stringstream spliter;
spliter << data;
std::vector<std::string> result;
while (!spliter.eof())
{
std::string str;
spliter >> str;
result.push_back(str);
}
for (int i = 0; i < result.size(); i++)
{
std::cout << result.at(i) << std::endl;
}
Đầu tiên chúng ta đẩy tất cả các kí tự đang được lưu trong string data vào đối tượng stringstream, với mỗi lần trích xuất dữ liệu bằng extraction operator (>>) vào một string khác, chúng ta thêm string đó vào vector kết quả.
Convert between strings and numbers
Vì insertion và extraction operator có thể làm việc với các kiểu dữ liệu cơ bản, chúng ta có thể sử dụng chúng để chuyển đổi strings sang number (và ngược lại).
Các bạn thử chạy đoạn chương trình sau để xem cách chuyển đổi từ numbers sang strings:
std::stringstream ss;
int nValue = 12345;
double dValue = 67.89;
ss << nValue << " " << dValue;
std::string strValue1, strValue2;
ss >> strValue1 >> strValue2;
std::cout << strValue1 << " " << strValue2 << std::endl;
Và đoạn chương trình sau chuyển strings về lại numbers:
std::stringstream ss;
ss << "12345 67.89";
int nValue;
double dValue;
ss >> nValue >> dValue;
std::cout << nValue << " " << dValue << std::endl;
Clear stringstream for reuse
Chúng ta có thể dùng một đối tượng stringstream cho nhiều string khác nhau bằng cách xóa dữ liệu bên trong buffer của nó đi. Sau đây là một số cách để xóa dữ liệu trong stringstream buffer:
std::stringstream ss;
ss.str(""); //erase the buffer
ss.clear(); //erase and reset error flags
Tổng kết
std::stringstream là một class khá hữu ích cho việc thao tác với kiểu dữ liệu std::string và chúng ta sẽ cần dùng chúng cho các công việc sau này.
Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.
Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn.