对于工作中的C++
项目,我使用GLPK
(用C
编写的Gnu线性编程工具包)。当我在控制台应用程序中使用某些过程时,会从GLPK
生成一个自动输出。
现在,在我将所有内容打包到GUI中之后,我想使用以前的diplayed文本。所以我将stdout和stderr重定向到文件。 (我在我的应用中使用printf("Hallo World");
检查它是否正常工作。
问题是文件GLPK
没有出现在文件中。经过一些研究后,我看到使用了xprintf(...)
语句。 (老实说,我不知道xprintf
做了什么,与printf
的区别是什么。)
有人可以解释一下:
答案 0 :(得分:1)
- 如何在没有标准输出的情况下在屏幕上打印文字。
醇>
默认情况下,您的平均stdout
是发生连接到终端的输出流。你可以用流做任何事情,包括reopen()
到文件。
正如您可以使用fopen()
创建另一个写入文件的流,您也可以使用它来创建另一个写入终端的流(在Linux中为/dev/tty
)。写入该流的输出将显示在您的终端上,尽管没有通过标准输出。
stdout只是一个方便的默认设置,绝不是访问终端的唯一方法。
答案 1 :(得分:1)
GLPK内部使用的xprintf
(glp_printf
的别名)在正常情况下写入stdout
(对于最新的GLPK版本4.47)。
有几种方法可以改变glp_printf
的行为:
glp_term_out(GLP_OFF)
glp_term_hook
函数安装一个钩子,该函数可以将输出重定向到钩子想要的任何地方glp_open_tee
函数如果您还没有使用上述任何内容,但仍然无法重定向stdout
输出,那么您重定向输出的方式可能会出现问题。< / p>
答案 2 :(得分:0)
stdout是缓冲的,因此只有在每个新行之后才会刷新文本。 您的某个库甚至xprintf本身可能会改变stdout的行为。 基本上,如果输出不以换行符结束,则无法保证看到先前的printf()输出。
尝试使用:
fflush (stdout);
在xprintf之后。
fflush在stdio.h中
通常xprintf是非mallocing printf。
答案 3 :(得分:0)
在GLPK中,xprintf
是_glp_lib_xprintf
的宏别名(在glplib.h
中定义)。
xprintf()
已在glplib04.c
中实施。默认情况下,它会输出到stdout
(通过同一源文件中的xputc()
函数)。有各种配置选项可以更改xputc()
的行为。
您可能希望在_glp_lib_xprintf()
上设置断点,然后逐步查看正在发生的事情。