[英]Standard output hangs after adding fprintf() statement with custom standard error
我有一個帶有成員函數extractData()
的C ++類Archive
。 此函數調用realExtractData()
,該函數在單獨的C庫中實現。
我想將一對通常通常為stdout
和stderr
的FILE *
實例傳遞給extractData()
函數,但是我也想提供自定義文件指針的選項:
class Archive {
public:
...
int extractData(string id, FILE *customOut, FILE *customErr);
...
};
int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
fprintf(stderr, "something went wrong...\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
如果按上述方式調用上述方法,則將數據輸出到標准輸出沒有延遲。 所有提取的數據幾乎立即發送到標准輸出( stdout
):
FILE *outFp = stdout;
FILE *errFp = stderr;
Archive *archive = new Archive(inFilename);
if (archive->extractData(id, outFp, errFp) != EXIT_SUCCESS) {
fprintf(errFp, "[error] - could not extract %s\n", archive->getInFnCStr());
return EXIT_FAILURE;
}
如果我更改extractData()
,使其fprintf()
調用使用customErr
:
int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
fprintf(customErr, "something went wrong...\n"); /* <-- changed this line */
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
...然后,當我運行二進制文件時,二進制文件似乎掛在處理輸入並打印到標准輸出上。
如果我將fprintf()
改回使用stderr
而不是customErr
,則事情將再次正常運行, 即 ,數據將立即刷新到標准輸出(我的customOut
)。
這是一個緩沖問題嗎? 有沒有辦法解決這個問題?
“ stderr而不是customErr”
標准錯誤沒有緩沖,這意味着它幾乎立即打印出來。 除非使用低級OS調用,否則將緩沖其他輸出流,這意味着除非您使用endl,:: flush或其他方法進行緩沖區刷新,否則它們將花費更長的時間打印。
如果您要進行低級OS調用並且正在使用UNIX,請查看以下內容:
http://www.annrich.com/cs590/notes/cs590_lecture_2.pdf
我還沒有讀完整的書,但是在掃描它時,它似乎具有與Unix優秀的Stevens Advanced Programming書類似的信息,該書對此進行了詳盡的論述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.