Единственный (простой) переносимый способ включает изготовление копии:
std::istringstream ss(std::string(buf,len));
На самом деле, это скорее всего копирование данных дважды, один раз для создания string
и один раз для создания istringstream
. (Возможно, C ++ 11 может избежать одной из копий с помощью конструктора перемещения; я не уверен.)
Однако, если вам повезет, ваша реализация C ++ позволит вам сделать это:
std::istringstream ss;
ss.rdbuf()->pubsetbuf(buf,len);
В GNU C ++ (и, я полагаю, в некоторых других реализациях) это создаст поток строк без копирования данных. Но это поведение, определяемое реализацией в соответствии со спецификацией. (См. Также этот вопрос .)
Включая параметр len
, вы гарантируете, что у обоих из них не будет проблем с нулевыми символами.
Единственный переносимый способ сделать то, что вы хотите, - реализовать собственный подкласс stringbuf
и использовать его для инициализации потока строк. Не для слабонервных.