перенаправление setbuf - PullRequest
       22

перенаправление setbuf

1 голос
/ 17 августа 2011

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

Как объяснено в следующем коде:

#define bufSize  100
int main()
{
    char buf[bufSize];
    setbuf(stdout, buf);
    printf("123");             //123 is written to the buffer

    setbuf(stdout,NULL);       //123 is written to the stdout(unwanted side effect)
    printf("456");             //123456 appears in the stdout
}

Как я могу решить проблему?

Другой вопрос, касающийся этого - этот код будет работать для Unix / Linux / Mac OS?

Может кто-нибудь предложить решение для перенаправления

Ответы [ 3 ]

3 голосов
/ 17 августа 2011

Функция setbuf() не перенаправляет вывод в буфер. Он просто говорит стандартной библиотеке ввода-вывода "использовать этот буфер; не выделяйте его самостоятельно".

Также предполагается, что вы используете setbuf() один раз для каждого открытого потока (сразу после его открытия и до того, как с ним что-нибудь еще будет сделано) и после этого оставляете его в покое. Если вы используете его несколько раз, вы попадаете в неопределенное поведение - и то, что вы видите, приемлемо, потому что требуемое поведение не определено.

Стандарт C99 гласит:

§7.19.5.5 Функция setbuf

За исключением того, что он не возвращает никакого значения, функция setbuf эквивалентна setvbuf функция вызывается со значениями _IOFBF для режима и BUFSIZ для размера, или (если buf является нулевым указателем) со значением _IONBF для режима.

§7.19.5.6 Функция setvbuf

Функция setvbuf может использоваться только после того, как поток, на который указывает поток, имеет был связан с открытым файлом и перед любой другой операцией (кроме В потоке выполняется неудачный вызов setvbuf).

2 голосов
/ 17 августа 2011

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

Если вы используете setbuf(stdout, NULL), он создаст новый буфер за сценой.И это будет небуферизованная запись .. т.е. не требуется очистка.

Так что здесь нет побочных эффектов, просто нормальное поведение.


Если вы хотите перенаправить stdout look здесь .Первые два ответа описывают две техники, которые это делают.

1 голос
/ 17 августа 2011

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

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

...