Почему Ostringstream лишает NULL? - PullRequest
5 голосов
/ 14 июля 2011

У меня есть строка, последняя часть которой (суффикс) должна быть изменена несколько раз, и мне нужно сгенерировать новые строки.Я пытаюсь использовать ostringstream, чтобы сделать это, как я думаю, использование потоков будет быстрее, чем конкатенации строк.Но когда предыдущий суффикс больше последующего, он запутывается.Поток также удаляет нулевые символы.

#include<iostream>
#include<sstream>

using namespace std;

int main()
{
  ostringstream os;
  streampos pos;
  os << "Hello ";
  pos = os.tellp();
  os << "Universe";
  os.seekp(pos);
  cout<<  os.str() << endl;
  os << "World\0";
  cout<<  os.str().c_str() << endl;
  return 0;
}

Вывод

Hello Universe
Hello Worldrse

Но я хочу Hello World.Как мне это сделать?Есть ли другой способ сделать это более быстрым способом?

Редактировать: Добавление std::ends работает.Но интересно, как это работает внутри.Также хотелось бы знать, есть ли более быстрые способы сделать то же самое.

Ответы [ 3 ]

9 голосов
/ 14 июля 2011

Строка "World" уже оканчивается нулем. Вот как работают C-строки. «Мир \ 0» имеет два символа \0. Следовательно, operator<<(ostream&, const char*) будет обрабатывать их одинаково и копировать все символы до \0. Вы можете увидеть это еще более ясно, если вы попробуете os << "World\0!". ! не будет скопирован вообще, так как operator<< остановился на первом \0.

Итак, это не ostringstream. Так работает C-строка, известная как const char*.

3 голосов
/ 14 июля 2011

Это ничего не раздевает. Все строковые литералы в C ++ заканчиваются NUL, поэтому, вставляя один из них вручную, вы просто заканчиваете строку, если это касается любого, кто ее обрабатывает. Используйте ostream::write или ostream::put, если вам нужно это сделать - все, что ожидает char* (без дополнительного аргумента для размера), скорее всего, будет относиться к нему специально.

os.write("World\0", 6);
0 голосов
/ 14 июля 2011

Почему вы считаете, что потоковая операция быстрее строки? И зачем собирать строку перед выводом в cout?

Если вы хотите использовать префикс для вывода, вы можете просто сделать это следующим образом

const std::string prefix = "Hello ";

std::cout << prefix << "Universe" << std::endl;
std::cout << prefix << "World" << std::endl;
...