Запись std::ostringstream в файл без копирования?

#c #io

#c #io

Вопрос:

Дана функция, которая принимает выходной stringstream в качестве аргумента:

 void Foo(const std::ostringstreamamp; _oss);
  

Есть ли какой-либо способ записи буфера потока в файл БЕЗ необходимости вызывать str() ?

Я хочу избежать копирования буфера (что делает str()).

 void Foo(const std::ostringstreamamp; _oss);
{
  std::ofstream f("foo.bin");

  //WANT: write _oss to f without copying the buffer?
}
  

Ответ №1:

Есть operator<<() взятие буфера потока:

 f << _oss.rdbuf();
  

Однако буфер должен быть действительно большим, чтобы это имело заметное значение. Обычно запись на диск в любом случае занимает больше времени, необходимого для этого.

Обратите внимание, что я бы избегал создания идентификаторов с начальными символами подчеркивания.

Комментарии:

1. Это позволило бы записывать буфер побайтно, правильно? Интересно, будет ли это медленнее, чем получение буфера через str () и запись его одним выстрелом..

2. Если это действительно ostringstream , не мог ли связанный stringbuf быть создан в режиме только вывода?

3. Это действительно работает. Однако у меня есть дополнительное ограничение, которое создает проблему — мне нужно знать размер буфера перед записью в файл, поскольку мне нужно выполнить специальную обработку в зависимости от размера. Я думаю, str () — это мое единственное средство..

Ответ №2:

Вы не можете записать его в файл без копирования — потому что это то, что делает запись в файл, она копирует его из памяти на диск.

Конечно, если вы хотите получить техническую информацию об этом, вы могли бы использовать файл с отображением в памяти.

Комментарии:

1. turbovince пытался избежать копирования, выполняемого путем вызова str() функции-члена.