我想將stdout和stderr重定向到一個函數並編寫一個簡單的代碼。 fprintf是好的,但是當我使用printf沒有\ r,流傳遞給終端!重定向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-標準輸出測試
3- printf的隨r測試
端子輸出:
$ ./sample
4-printf without r test
1.排除縮進2.爲什麼不檢查'fopen'的返回值3.'fprintf(pFile,buf);' - 讓我們希望'buf'中不包含'%'! –
您正在使用'buf'作爲格式字符串。如果它包含任何'%'字符,這將失敗得相當可怕。使用'fprintf(pFile,「%s」,buf)'或者調用'fwrite'而不是'fprintf'。 –
你也可以調用'fputs'而不是'fprintf'。這可能是最簡單的。 –