C++ xprintf不';不要使用标准符号。它是如何在屏幕上打印的?
对于工作中的C++ xprintf不';不要使用标准符号。它是如何在屏幕上打印的?,c++,c,printf,stdout,C++,C,Printf,Stdout,对于工作中的C++项目,我使用GLPK(用C编写的Gnu线性规划工具包)。在控制台应用程序中使用某些过程时,会自动从GLPK生成输出 现在,在我将所有这些打包到GUI中之后,我想使用以前显示的文本。所以我将stdout和stderr重定向到文件。(我用我的应用程序中的printf(“Hallo World”);检查它是否正常工作) 问题是GLPK格式的文本没有出现在文件中。经过一些研究,我发现使用了xprintf(…)语句。(老实说,我不知道xprintf有什么作用,也不知道printf有什么区
C++
项目,我使用GLPK
(用C
编写的Gnu线性规划工具包)。在控制台应用程序中使用某些过程时,会自动从GLPK
生成输出
现在,在我将所有这些打包到GUI中之后,我想使用以前显示的文本。所以我将stdout和stderr重定向到文件。(我用我的应用程序中的printf(“Hallo World”);
检查它是否正常工作)
问题是GLPK
格式的文本没有出现在文件中。经过一些研究,我发现使用了xprintf(…)
语句。(老实说,我不知道xprintf
有什么作用,也不知道printf
有什么区别。)
请有人解释一下:
默认情况下,标准输出是缓冲的,所以文本只有在每一行新行之后才会刷新。 您的某个库甚至xprintf本身可能会改变标准输出的行为。 基本上,如果之前的printf()输出没有以换行符结尾,则不能保证看到该输出 尝试使用:
fflush (stdout);
在xprintf之后
弗卢什在stdio.h
通常xprintf是非mallocing printf
stdout
是一个输出流,默认情况下恰好连接到终端。你可以用它做任何可以用流来做的事情,包括reboon()
将它保存到文件中
正如您可以使用fopen()
创建另一个写入文件的流一样,您也可以使用它创建另一个写入终端的流(在Linux中是/dev/tty
)。写入该流的输出将显示在终端上,尽管没有通过标准输出
stdout只是一个方便的默认值,绝不是访问终端的唯一方式。在GLPK中,
xprintf
是\u glp\u lib\u xprintf
的宏别名(定义见glplib.h
)
xprintf()
在glplib04.c
中实现。默认情况下,它会输出到stdout
(通过同一源文件中的xputc()
函数)。有多种配置选项可以更改xputc()
的行为
您可能希望在\u glp\u lib\u xprintf()
上设置一个断点,然后逐步查看发生了什么情况。在正常情况下(对于最新的GLPK版本4.47),GLPK内部使用的xprintf
(glp\u printf的别名)
有几种方法可以更改glp\u printf
的行为:
- 使用
glp\u term\u out(glp\u OFF)
- 使用
函数安装钩子,该函数可以将输出重定向到钩子想要的任何位置glp\u term\u hook
- 将输出的副本写入文本文件-可以使用
功能进行设置glp\u open\u tee
如果您没有使用上述任何一项,并且仍然无法重定向
stdout
输出,那么重定向输出的方式可能有问题。您是否检查过它是否使用stderr
?可能很简单。我想我已经将stderr重定向到error.txt了。但是我打印错误的测试没有显示在error.txt中。我必须再次检查它。stderr被重定向到error.txt。(用fprintf(stderr,“ERROR1”)检查;
stranglyperror(“ERROR2”);
没有出现在error.txt中(我不得不说这是我第一次使用该语句,我不熟悉它的行为)@MartinHoratschek标准的peror
函数总是打印到stderr,因此,如果您在过程完成后没有在错误文件中看到它的输出,则可能是您(或GLPK)没有使用标准的peror
函数,或者您没有正确地重定向stderr(您的注释说您已经测试过了).您使用的是哪个版本的GLPK?如何将stdout重定向到文件?我想知道在本文中“通常”是什么意思。xprintf()
不是一个标准函数,我找不到关于它的任何文档。我通常编辑为。非mallocing printf的一个实现是:。我编写了自己的非malloc'ingprintf()
,谢谢。-)我觉得不必要调用malloc()标准函数中的
有些死气沉沉——在printf()的上下文中是不必要的只是好奇-为什么printf()
需要动态内存?glibc(或另一个通用的C运行库)做过这样的事情吗?在stdiocommon/vfprintf.C中有很多对malloc的调用,printf()似乎决定使用vfprintf。动态内存可能是在那里实现的,以创建可消耗的缓冲区来更改字符表示等等。我很乐意尝试一下。但是我链接了glpk_4_47.dll
,我看不到在那里设置断点的方法。我认为你应该只构建一个带有符号的调试版本的dll。我接受这个作为我的答案,因为它为我的主要问题提供了一个解决方案。我刚刚使用了glp_open_tee(“tee.tee”)代码>并且得到了我想要的一切。stdout的重定向只是我试图做那条语句所做的事情。我感谢所有提供帮助的人。