#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()
функции-члена.