Có nhiều cách để đọc văn bản từ stdin thành std::string
. Những điều về std::string
s mặc dù là chúng phát triển khi cần thiết, do đó có nghĩa là họ tái phân bổ. Bên trong một số std::string
có con trỏ đến bộ đệm có độ dài cố định. Khi bộ đệm đầy và bạn yêu cầu thêm một hoặc nhiều ký tự vào bộ đệm, đối tượng std::string
sẽ tạo bộ đệm mới, lớn hơn thay cho bộ đệm cũ và di chuyển tất cả văn bản sang bộ đệm mới.
Tất cả điều này để nói rằng nếu bạn biết độ dài của văn bản bạn sắp đọc trước đó thì bạn có thể cải thiện hiệu suất bằng cách tránh các phân bổ lại này.
#include <iostream>
#include <string>
#include <streambuf>
using namespace std;
// ...
// if you don't know the length of string ahead of time:
string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());
// if you do know the length of string:
in.reserve(TEXT_LENGTH);
in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());
// alternatively (include <algorithm> for this):
copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(),
back_inserter(in));
Tất cả những điều trên sẽ sao chép tất cả văn bản được tìm thấy trong tiêu chuẩn, cho đến cuối tệp. Nếu bạn chỉ muốn có một dòng duy nhất, sử dụng std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while(getline(cin, in)) {
// ...
}
Nếu bạn muốn có một nhân vật duy nhất, sử dụng std::istream::get()
:
#include <iostream>
// ...
char ch;
while(cin.get(ch)) {
// ...
}
Việc bạn sử dụng printf là không an toàn, nó phải được 'printf ("% s ", s.c_str());' để ngăn chặn tràn bộ đệm. – LiraNuna
Bạn nói đúng, tôi sẽ sửa nó. –