Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ xprintf不';不要使用标准符号。它是如何在屏幕上打印的?_C++_C_Printf_Stdout - Fatal编程技术网

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”)检查;
    strangly
    perror(“ERROR2”);
    没有出现在error.txt中(我不得不说这是我第一次使用该语句,我不熟悉它的行为)@MartinHoratschek标准的
    peror
    函数总是打印到stderr,因此,如果您在过程完成后没有在错误文件中看到它的输出,则可能是您(或GLPK)没有使用标准的
    peror
    函数,或者您没有正确地重定向stderr(您的注释说您已经测试过了).您使用的是哪个版本的GLPK?如何将stdout重定向到文件?我想知道在本文中“通常”是什么意思。
    xprintf()
    不是一个标准函数,我找不到关于它的任何文档。我通常编辑为。非mallocing printf的一个实现是:。我编写了自己的非malloc'ing
    printf()
    ,谢谢。-)我觉得不必要调用
    malloc()标准函数中的
    有些死气沉沉——在printf()的上下文中是不必要的只是好奇-为什么
    printf()
    需要动态内存?glibc(或另一个通用的C运行库)做过这样的事情吗?在stdiocommon/vfprintf.C中有很多对malloc的调用,printf()似乎决定使用vfprintf。动态内存可能是在那里实现的,以创建可消耗的缓冲区来更改字符表示等等。我很乐意尝试一下。但是我链接了
    glpk_4_47.dll
    ,我看不到在那里设置断点的方法。我认为你应该只构建一个带有符号的调试版本的dll。我接受这个作为我的答案,因为它为我的主要问题提供了一个解决方案。我刚刚使用了
    glp_open_tee(“tee.tee”)并且得到了我想要的一切。stdout的重定向只是我试图做那条语句所做的事情。我感谢所有提供帮助的人。