xprintf不使用stdout。它如何在屏幕上打印?

时间:2012-11-15 08:26:30

标签: c++ c printf stdout

对于工作中的C++项目,我使用GLPK(用C编写的Gnu线性编程工具包)。当我在控制台应用程序中使用某些过程时,会从GLPK生成一个自动输出。

现在,在我将所有内容打包到GUI中之后,我想使用以前的diplayed文本。所以我将stdout和stderr重定向到文件。 (我在我的应用中使用printf("Hallo World");检查它是否正常工作。

问题是文件GLPK没有出现在文件中。经过一些研究后,我看到使用了xprintf(...)语句。 (老实说,我不知道xprintf做了什么,与printf的区别是什么。)

有人可以解释一下:

  1. 如何在没有标准输出的情况下在屏幕上打印文本。
  2. 如何将自动生成的输出提供给文件或流或我能处理的任何内容。

4 个答案:

答案 0 :(得分:1)

  
      
  1. 如何在没有标准输出的情况下在屏幕上打印文字。
  2.   

默认情况下,您的平均stdout发生连接到终端的输出流。你可以用流做任何事情,包括reopen()到文件。

正如您可以使用fopen()创建另一个写入文件的流,您也可以使用它来创建另一个写入终端的流(在Linux中为/dev/tty)。写入该流的输出将显示在您的终端上,尽管没有通过标准输出。

stdout只是一个方便的默认设置,绝不是访问终端的唯一方法。

答案 1 :(得分:1)

GLPK内部使用的xprintfglp_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()上设置断点,然后逐步查看正在发生的事情。