我有一个带有成员函数Archive
的C ++类extractData()
。此函数调用realExtractData()
,它在单独的C库中实现。
我希望将extractData()
函数传递给FILE *
和stdout
stderr
个实例,但我希望提供自定义文件指针选项,以及:
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
)立即。
这是一个缓冲问题吗?有办法解决这个问题吗?
答案 0 :(得分:0)
“stderr而非customErr”
标准错误是非缓冲的,这意味着它几乎立即打印出来。其他输出流是缓冲的,除非您使用的是低级操作系统调用,这意味着它们需要更长时间才能打印,除非您使用endl,:: flush或其他任何东西进行缓冲区刷新。
如果您想要进行低级操作系统调用,并且您正在使用unix,请查看以下内容:
http://www.annrich.com/cs590/notes/cs590_lecture_2.pdf
我还没有阅读整篇文章,但是在扫描它时,看起来好像它与Unix中的史蒂文斯高级编程书有着相似的信息,而这本书就是在讨论这个问题。