Я хочу перенаправить stdout и stderr в функцию и написать простой код. fprintf в порядке, но когда я использую printf без \ r, поток переходит к терминалу!redirect stdout/stderr для функции в C
#include <stdio.h>
static ssize_t file_write(void *c, const char *buf, size_t size)
{
FILE * pFile;
pFile = fopen ("output.txt","w");
fprintf(pFile, "%s", buf);
fclose (pFile);
return size;
}
void redirect()
{
FILE *stream;
stream=fopencookie(NULL, "w", (cookie_io_functions_t) {(ssize_t) 0, file_write, 0, 0});
setbuf(stdout, NULL);
stdout = stream;
setbuf(stderr, NULL);
stderr = stream;
}
int main()
{
redirect();
fprintf(stderr,"1-stderr test\n");
fprintf(stdout, "2-stdout test\n");
printf("3-printf with r test\n\r");
printf("4-printf without r test\n");
return 0;
}
файл "output.txt":
1-STDERR тест
2-STDOUT тест
3-Printf с испытанием г
терминальный выход:
$ ./sample
4-Printf без г теста
1. Отсоедините отступ 2. Почему бы не проверить возвращаемое значение из 'fopen' 3.' fprintf (pFile, buf); '- позволяет надеяться, что' buf' не содержит '%' в нем! –
Вы используете 'buf' как строку формата. Это будет ужасно неудачно, если оно содержит любые '%' символы. Или используйте 'fprintf (pFile,"% s ", buf)' или иначе вызывать 'fwrite' вместо' fprintf'. –
Вы также можете вызвать 'fputs' вместо' fprintf'. Это может быть проще всего. –