Я не знаю, считается ли это " чрезмерным копированием ", но вы можете использовать поток строк:
std::ostringstream ss;
ss << someStreamBuf;
std::string s = ss.str();
Например, чтобы прочитать все из стандартного ввода в строку, выполните
std::ostringstream ss;
ss << std::cin.rdbuf();
std::string s = ss.str();
В качестве альтернативы вы также можете использовать istreambuf_iterator
. Вы должны будете измерить, является ли этот или вышеупомянутый способ более быстрым - я не знаю.
std::string s((istreambuf_iterator<char>(someStreamBuf)),
istreambuf_iterator<char>());
Обратите внимание, что someStreamBuf
выше означает streambuf*
, поэтому примите его адрес соответствующим образом. Также обратите внимание на дополнительные скобки вокруг первого аргумента в последнем примере, чтобы он не интерпретировался как объявление функции, возвращающей строку и принимающей итератор и другой указатель на функцию («самый неприятный анализ»).