setbuf () - printf () и write () - PullRequest
       28

setbuf () - printf () и write ()

0 голосов
/ 03 сентября 2018

это мой первый шаг на Stackoverflow!

Итак, я пытаюсь использовать setbuf() для перенаправления stdout в char buffer[BUFSIZ]. Он отлично работает, когда я использую printf(), но не совсем, когда я использую системный вызов write().

Вот пример кода:

#include <stdio.h>
#include <unistd.h>

int     main(void)
{
    char    buffer[BUFSIZ];

    freopen("/dev/null", "a", stdout);
    setbuf(stdout, buffer);
    printf("This works\n");
    write(stdout->_file, "This doesn't.\n", 14);
    fflush(stdout);
    freopen("/dev/tty", "a", stdout);
    printf("Buffer content :\n%s", buffer);
    return 0;
}

И вывод

Содержимое буфера:
Это работает

У вас есть идеи, почему? Потому что пока я не вижу, как это работает, я передам стандартный вывод на стандартный ввод, а затем прочту результат - я думаю, это не самый чистый способ сделать это.

Спасибо, и хорошего дня!

1 Ответ

0 голосов
/ 03 сентября 2018

Функция write - это функция низкого уровня POSIX, которая работает на более низком уровне, чем стандартные функции вывода C.

Используя write напрямую, вы обходите буферизацию stdio. Если вы хотите использовать буфер, используйте вместо него стандартную функцию C fwrite.

Также обратите внимание, что stdout - это FILE*, а FILE - непрозрачная структура данных. Никогда не пытайтесь использовать его члены напрямую.

...