3

对于C++工作中的项目,我使用GLPK(用 编写的 Gnu 线性编程工具包C)。当我在控制台应用程序中使用某些程序时,会从GLPK.

现在,在我将所有内容打包到 GUI 中之后,我想使用以前显示的文本。所以我将标准输出和标准错误重定向到文件。(我检查了它printf("Hallo World");在我的应用程序中可以正常工作)。

问题是文本形式GLPK没有出现在文件中。经过一些研究,我发现使用了该语句xprintf(...)。(老实说,我不知道有什么xprintf作用以及有什么区别printf。)

有人可以解释一下:

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

4 回答 4

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

您的平均值是默认情况下恰好连接到终端stdout的输出流。你可以用它做任何可以用流做的事情,包括它到一个文件中。reopen()

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

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

于 2012-11-15T09:21:11.567 回答
1

GLPK 内部使用的xprintf(别名glp_printf)在正常情况下写入stdout(对于最新的 GLPK 版本 4.47)。

有几种方法可以改变 的行为glp_printf

  • 使用禁用输出glp_term_out(GLP_OFF)
  • 使用该函数安装一个钩子,该glp_term_hook函数可以将输出重定向到钩子想要的任何地方
  • 将输出的副本写入文本文件 - 这可以使用glp_open_tee函数进行设置

如果您没有使用上述任何方法,并且仍然无法重定向stdout输出,那么您重定向输出的方式可能有问题。

于 2012-11-15T10:32:46.340 回答
0

默认情况下,stdout 是缓冲的,因此文本只会在每个新行之后刷新。您的某个库甚至 xprintf 本身可能会改变标准输出的行为。基本上,如果输出不以换行符结尾,则不能保证看到以前的 printf() 输出。

尝试使用:

fflush (stdout);

在 xprintf 之后。

fflush 在 stdio.h 中

通常 xprintf 是非分配 printf。

于 2012-11-15T09:12:18.623 回答
0

在 GLPK 中,xprintf_glp_lib_xprintf(定义在 中glplib.h)的宏别名。

xprintf()实施于glplib04.c. 默认情况下,它会输出到stdout(通过xputc()同一源文件中的函数)。有多种配置选项可以改变xputc().

您可能想设置一个断点_glp_lib_xprintf()并逐步查看发生了什么。

于 2012-11-15T10:28:10.517 回答