Streams for string C++

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.

www.daynhauhoc.com

7 Likes

Hình như 2 cái này hơi bựa bựa anh Vũ ơi ?

1 Like
  • Mình xin có ý kiến phần này đề nghị tác giả viết cụ thể để cho người mới học cũng hiểu. Mình cóp 1 số đưa vào chạy thì báo lỗi. Cuối cùng phải dùng Google “stringstream in C++” ra được tutorial in http://www.cplusplus.com/reference/sstream/stringstream/str/. Lúc đó người học dễ hiểu hơn. Mình xin cám ơn.
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream, std::stringbuf

int main () {
  std::stringstream ss;
  ss.str ("Example string");
  std::string s = ss.str();
  std::cout << s << '\n';
  return 0;
}

mà cho em hỏi cái stream of string dùng để làm j v anh

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