Если оставаться в рамках stdio: - если есть funopen() или fopencookie(): принимать данные в увеличивающийся буфер или в цепочку буферов, потом выделив окончательного размера. С постепенным увеличением проще, но может брать лишнее согласно алгоритму (например, часто следующий размер берут в 2 раза больше предыдущего). С цепочкой немного экономнее в процессе;) - если есть правильный snprintf(): вызвать vsnprintf(NULL,0,format,args), он вернёт размер сколько хотели записать, выделить столько и повторить запись уже в реальный буфер. - если есть кривой snprintf() (типа того что у Microsoft): периодически увеличивать буфер пока не поместится.
Наконец, суперзапасной вариант - открывается /dev/null, fprintf() в него показывает сколько надо отвести байт, тогда отвести буфер такого размера и записать в него.
no subject
Date: 2005-12-26 12:41 pm (UTC)- если есть funopen() или fopencookie(): принимать данные в увеличивающийся буфер или в цепочку буферов, потом выделив окончательного размера. С постепенным увеличением проще, но может брать лишнее согласно алгоритму (например, часто следующий размер берут в 2 раза больше предыдущего). С цепочкой немного экономнее в процессе;)
- если есть правильный snprintf(): вызвать vsnprintf(NULL,0,format,args), он вернёт размер сколько хотели записать, выделить столько и повторить запись уже в реальный буфер.
- если есть кривой snprintf() (типа того что у Microsoft): периодически увеличивать буфер пока не поместится.
Наконец, суперзапасной вариант - открывается /dev/null, fprintf() в него показывает сколько надо отвести байт, тогда отвести буфер такого размера и записать в него.