有許多方法可以將stdin中的文本讀入std::string
。關於std::string
的一點是,它們根據需要增長,這又意味着它們重新分配。內部std::string
有一個指向固定長度緩衝區的指針。當緩衝區已滿並且您請求向其添加一個或多個字符時,std::string
對象將創建一個新的,較大的緩衝區而不是舊的緩衝區,並將所有文本移至新緩衝區。
這一切都是說,如果您知道預先要閱讀的文本的長度,那麼您可以通過避免這些重新分配來提高性能。
#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));
以上所有將複製在標準輸入中找到的所有文本,直到文件結束。如果你只想要一個單一的線,使用std::getline()
:
#include <string>
#include <iostream>
// ...
string in;
while(getline(cin, in)) {
// ...
}
如果你想要一個字符,使用std::istream::get()
:
#include <iostream>
// ...
char ch;
while(cin.get(ch)) {
// ...
}
你用printf是不安全的,應該'的printf(「%S 「,s.c_str());'以防止緩衝區溢出。 – LiraNuna 2010-04-11 19:57:22
你說得對,我會糾正它。 – 2010-04-11 21:55:20