Это просто использование временного файла в качестве места, в которое он может записать содержимое, которое не будет переполнено, поэтому он может измерить длину, затем выделить достаточно места для строки и, наконец, поместить реальный вывод в строку.
Я бы, по крайней мере, подумал, насколько сложно было бы заменить текущий интерфейс в стиле printf, который ведет к этому, интерфейсом в стиле iostreams, который позволит легко избежать и , дающих все обычные преимущества iostreams (тип-безопасный, расширяемый и т. д.)
Редактировать: если изменение сигнатуры функции действительно слишком сложно для размышления, то вы, вероятно, захотите заменить vfprintf
на vsnprintf
. vsnprintf
позволяет вам указать длину буфера (чтобы он не переполнял буфер) и возвращает количество символов, которые сгенерировали бы , если бы было достаточно места. Таким образом, использование будет почти таким же, как у вас сейчас, но избегайте генерации временного файла. Вы бы назвали его один раз, указав длину буфера 0, используйте возвращаемое значение (+1 для терминатора NUL), чтобы изменить размер буфера, а затем вызовите его снова, указав правильный размер буфера.