【问题标题】:C90 printf with \n or \r\n not working in cygwin; but fflush(stdout); works fine. why?带有 \n 或 \r\n 的 C90 printf 在 cygwin 中不起作用;但是 fflush(stdout);工作正常。为什么?
【发布时间】:2013-08-01 03:12:29
【问题描述】:

Cygwin64 位

编译命令:

gcc hello.c -o hello -ansi -pedantic-errors

运行命令

./hello

你好.c

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n");
    printf("hello world again!\r\n");
    /*fflush(stdout);           without fflush, the above strings are not showing*/

    while(1)
    {
    }
}

问题:

  1. 我不希望每次 printf 后都 fflush 让终端及时显示字符串,那怎么办?

    答案:setbuf(stdout, 0);

  2. 考虑到很多帖子指出换行符可以解决问题,为什么“\n”或“\r\n”在我的情况下不起作用?

  3. cygwin 终端的行为是否与普通 Linux 终端不同?由于我没有安装linux,有人给我测试一下吗?

  4. 或者让我问一个更笼统的问题:在哪种终端上,“换行将强制刷新”这句话是正确的?

谢谢

【问题讨论】:

  • 这可能是重复的:stackoverflow.com/questions/1716296/…
  • 我对 cygwin 的体验是它接近 Linux 的感觉,但无论你怎么努力都无法达到。可能是内核没有检测到您处于终端会话中。也许尝试不同的终端(xterm,也许?),甚至是不同的 shell。看看当您通过ssh 登录时会发生什么。如果您尝试任何方法都无法解决问题,那么 cygwin 完全有可能很糟糕。
  • “cygwin 的终端与普通 Linux 终端的行为是否不同?”有许多不同的 linux 终端,我认为它们的行为并不相同。但是如果你在谈论内核终端,是的,我想它一定是非常不同的。前任。 :en.wikipedia.org/wiki/Comparison_of_terminal_emulators
  • 根据这个页面,现在默认是薄荷味的。 code.google.com/p/mintty(编辑----我说错了:我认为Cygwin默认使用Windows控制台。----)
  • 它在 Cygwin 上对我有用。很难从您的问题中分辨出什么有效或无效。您的评论说“我知道这会起作用”,但实际上并没有,对吧?请向我们展示一个不起作用的实际程序,并清楚地说明它的行为方式。顺便说一句,您 不需要 需要打印 \r 字符;只需 '\n' 即可指定行尾。

标签: c gcc cygwin printf


【解决方案1】:

在 Cygwin 中,stdout 似乎没有被识别为终端(而是作为管道),因此默认情况下它不是行缓冲的。

基于this answer,也许与 Cygwin DLL 链接会有所帮助。

【讨论】:

  • 从@LidongGuo 的测试来看,我们几乎可以肯定是Cygwin 的问题。目前我不会修复 Cygwin 问题,所以很高兴接受这个答案。
【解决方案2】:

该程序适用于我在 32 位 Cygwin 下。具体来说,当我编译并执行这个程序时:

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n");
    printf("hello world again!\r\n");
    /*fflush(stdout);           without fflush, the above strings are not showing*/

    while(1)
    {
    }
}

它产生这个输出:

hello world!
hello world again!

然后挂起,直到我用 Ctrl-C 杀死它。

我在 Windows 控制台、mintty 和 xterm 下从 bash 调用程序时得到了相同的行为(我怀疑终端会有所作为)。

我在 64 位 Windows 7 下使用 32 位 Cygwin。您说您使用的是 64 位 Cygwin,即 just announced a few days ago;我还没试过。

我怀疑 64 位与 32 位 Cygwin 存在问题。我建议你发帖到Cygwin mailing list

这是您的程序的清理版本,它应该会出现相同的问题(请验证 cmets 是否正确):

#include <stdio.h>
int main(void) {
    /* Adding setbuf(stdout, 0) here makes the output appear */
    printf("hello world!\n");
    /* Adding fflush(stdout) here makes the output appear */
    while(1) {
        /* nothing */
    }
}

【讨论】:

  • 我已经在 Windows 8 64 位上验证了 32 位 Cygwin,上面的代码可以打印出“hello world!”。但是,我无法在 Windows 8 64 位的 64 位 Cygwin 上正确安装 gcc。我不确定这是否是另一个问题。同样,在我的机器上,Windows 7 64 位上的 64 位 Cygwin 无法显示“hello world!”
【解决方案3】:

我对 cgywin 一无所知。但这里我在 Linux 中做了一个测试。

我尝试下面的代码,并编译:gcc -std=c90 filename.c

没有 fflush 它在循环之前打印所有单词,所以我认为换行符会刷新缓冲区!它只是工作!

我使用 SUSE gcc 。

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n"); /*without fflush, not shown*/
    printf("hello world again!\r\n"); /*without fflush, not shown*/
  /* fflush(stdout);*/

    while(1)
    {
    }
}

【讨论】:

  • @是的,但是看到“有人给我做个测试吗?”,所以我做测试!
  • 是的,您确实解决了部分问题。但是你没有明确表示你不回答更大的问题。
  • @LidongGuo。谢谢。你帮我缩小了问题的范围。我们确定这是由 Cygwin 引起的问题。
【解决方案4】:

我刚遇到这个问题。我有一些我一直在研究的代码,不得不在我的电脑上重新安装 Cygwin。我这次安装的是64位版本,之前是x86的。

构建我的代码,在 bash shell 中运行它并且没有输出。

我没有意识到我的 bin 文件夹中还有一个来自以前 32 位版本的 cygwin 的 Cygwin1.dll。我重命名了它并运行了我的程序并且输出有效。

您可能有不同的问题,但如果您的 bin 其他文件夹使用了不同的 dll 版本,则可能会导致此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多