【问题标题】:Output not displayed with usleep until a line break is given在给出换行符之前不显示输出
【发布时间】:2013-04-22 08:16:46
【问题描述】:

我正在尝试用 C 编写一个简单的“打字机”效果,其中文本一次出现一个字母,但有延迟。这是我的功能:

#include <stdio.h>
#include <unistd.h>

void typestring(const char *str, useconds_t delay)
{
    while (*str) {
        putchar(*(str++));
        usleep(delay);
    }
}

问题是在显示\n 之前,文本实际上并没有出现。我做错了什么?

【问题讨论】:

  • 我已经多次被警告不要使用 fflush(),尤其是 fflush(stdin),我已经完全放弃使用 fflush()。
  • 谁能在不使用 fflush() 的情况下为这个打字机问题提供替代解决方案?
  • 我不知道在 Windows 中是否可行,但在 Linux 中你可以使用 &lt;termios.h&gt; 并将终端设置为非缓冲。查看我帖子中的链接

标签: c terminal output putchar


【解决方案1】:

stdout 的输出被缓冲。使用 \n 您正在强制刷新。如果你想改变这个,你需要改变终端的设置(对于 Linux 看 here)或者使用

void typestring(const char *str, useconds_t delay)
{
    while (*str) {
        putchar(*(str++));
        fflush(stdout);
        usleep(delay);
    }
}

【讨论】:

  • 你不是说stdout吗?无论如何,一旦我做出改变,它就完美无缺。非常感谢!
  • 你应该刷新stdout而不是stdin
  • 不确定,但这里的聪明人已经多次告诫我不要使用 fflush(stdin)。
【解决方案2】:

您的输出流可能已缓冲,'\n' 刷新缓冲区。

putchar() 之后尝试fflush(stdout,如

while (*str) {
        putchar(*(str++));
        fflush(stdout);
        usleep(delay);
    }

【讨论】:

    【解决方案3】:

    \n 隐式强制输出设备刷新缓冲输入。要刷新,您应该明确使用fflush:

     fflush(stdout);
    

    【讨论】:

      【解决方案4】:

      输出流被缓冲,这就是为什么在显示 \n 之前文本实际上不会出现 '\n' 刷新输出流(硬刷新)以手动执行您可以调用的相同操作 这个函数 [fflush(stdout)]。

      while (*str) {
              putchar(*(str++));
              fflush(stdout);
              usleep(delay);
          }
      

      或者你可以使用

      while (*str) {
                  printf("%c\n",*(str++));
                  usleep(delay);
              }
      

      【讨论】:

        猜你喜欢
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 2020-06-11
        • 2014-04-18
        相关资源
        最近更新 更多