std::getline
#include <string>
// (1) Đọc đến ký tự xuống dòng ('\n')
istream& getline( istream& is, string& str, charT delim = Traits::to_char_type('\n'));
// (2) Đọc đến ký tự delimiter do người dùng chỉ định.
istream& getline( istream& is, string& str, charT delim );
// (3) (since C++11)
istream& getline( istream&& is, string& str, charT delim );
// (4) Đọc đến ký tự xuống dòng ('\n') (since C++11)
istream& getline( istream&& is, string& str );
Đọc một dòng dữ liệu từ luồng đầu vào (input stream) và lưu trữ nó vào một đối tượng std::string. Khác với toán tử >>
, getline()
đọc toàn bộ dòng, bao gồm cả khoảng trắng, cho đến khi gặp ký tự xuống dòng (newline character) hoặc ký tự kết thúc (delimiter) do người dùng chỉ định.
Tham số
is
- Tham chiếu đến luồng đầu vào (input stream) mà từ đó dữ liệu sẽ được đọc (ví dụ: std::cin, std::ifstream). Có thể là một đối tượng tạm (temporary object)
str
- Tham chiếu đến đối tượng std::string nơi dữ liệu sẽ được lưu trữ.
delim
- Ký tự kết thúc (delimiter). Khi
getline()
gặp ký tự này, nó sẽ ngừng đọc. Ký tự delim sẽ được trích xuất khỏi luồng đầu vào nhưng không được thêm vào chuỗi str. Giá trị mặc định là '\n' (ký tự xuống dòng).
Giá trị trả về
std::istream&
- Tham chiếu đến luồng đầu vào (is).
Đặc điểm
getline()
đọc toàn bộ dòng, bao gồm cả khoảng trắng, cho đến khi gặp ký tự xuống dòng (newline character - \n) hoặc ký tự kết thúc (delimiter) do bạn chỉ định.getline()
loại bỏ ký tự kết thúc (newline hoặc delimiter) khỏi luồng đầu vào, nhưng không thêm ký tự này vào chuỗi str.- Bạn có thể chỉ định một ký tự kết thúc khác (delimiter) bằng cách truyền tham số thứ ba cho
getline()
. getline()
thay đổi trực tiếp nội dung của đối tượng std::string.getline()
trả về tham chiếu đến luồng đầu vào, cho phép bạn thực hiện chuỗi các phép đọc.- Bạn nên kiểm tra trạng thái của luồng đầu vào sau khi sử dụng
getline()
(ví dụ: kiểm tra xem std::cin hoặc std::ifstream có ở trạng thái tốt hay không) để đảm bảo rằng việc đọc dữ liệu thành công. getline()
thường được sử dụng để:- Đọc toàn bộ một dòng dữ liệu từ bàn phím (std::cin), bao gồm cả khoảng trắng.
- Đọc từng dòng dữ liệu từ file (sử dụng std::ifstream).
- Đọc dữ liệu từ các nguồn đầu vào khác cho đến khi gặp một ký tự phân tách cụ thể.
Phân biệt với toán tử
>>
operator>>
: Đọc dữ liệu cho đến khi gặp khoảng trắng.std::getline()
: Đọc dữ liệu cho đến khi gặp ký tự xuống dòng (hoặc ký tự kết thúc do bạn chỉ định).
Ví dụ
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
int main() {
std::string line;
// Đọc một dòng từ bàn phím
std::cout << "Enter a line of text: ";
std::getline(std::cin, line);
std::cout << "You entered: " << line << std::endl;
// Đọc từng dòng từ file
std::ifstream infile("example.txt");
if (infile.is_open()) {
while (std::getline(infile, line)) {
std::cout << "Line from file: " << line << std::endl;
}
infile.close();
} else {
std::cerr << "Unable to open file!\n";
}
// Đọc từ stringstream với delimiter tùy chỉnh
std::stringstream ss("apple,banana;orange,grape");
std::string item;
while (std::getline(ss, item, ',')) { // Đọc đến dấu phẩy
std::cout << item << " ";
}
std::cout << std::endl;
// Đọc từ stringstream với delimiter tùy chỉnh
std::stringstream ss2("apple,banana;orange,grape");
std::string item2;
while (std::getline(ss2, item2, ';')) { // Đọc đến dấu chấm phẩy
std::cout << item2 << " ";
}
std::cout << std::endl;
return 0;
}
Các hàm liên quan
operator>> | Đọc dữ liệu từ một luồng đầu vào và lưu trữ nó vào một đối tượng std::string |