【问题标题】:Copying stdin to buffer将标准输入复制到缓冲区
【发布时间】:2013-12-04 03:51:28
【问题描述】:

处理网络项目并使用 select() 和 FD_ISSET 同时观察标准输入和 TCP 连接。我似乎无法在缓冲区中捕获键盘输入以便处理它。这是我所拥有的:

if (FD_ISSET(0, &read_set)) {

    fprintf(stdout, "Keyboard input noted:\n");

    size_t bytes = fread(buffer, sizeof(char), BUFFSIZE, stdin);
    fwrite(buffer, sizeof(char), bytes, stdout);
    fflush(stdout);
    if (bytes < BUFFSIZE)
        if (feof(stdin))
            break;

    fprintf(stdout, "buffer: %s\n", buffer);
}

第一个 printf 语句在我按下回车键后立即输出,但第二个语句从不触发。有人能告诉我我错过了什么吗?谢谢!

编辑:当我将size_t bytes = fread(buffer, sizeof(char), BUFFSIZE, stdin); 更改为类似

size_t bytes = fread(buffer, sizeof(char), 2*sizeof(char), stdin);

然后输入像aa&lt;enter&gt; 这样的东西我可以强制它输出,但这太小了。当读取回车键时,我需要一种方法让它从 fread 返回。

【问题讨论】:

  • 尝试将bytes 写入stderr。
  • 你在打break吗?
  • @woolstar 我将 fwrite 行更改为 fwrite(buffer, sizeof(char, ytes, stderr); - 仍然没有输出
  • @BitFiddlingCodeMonkey 我在break 之前添加了一个输出行。我似乎没有到这里。
  • 打印bytes:fprintf(stderr, "bytes read = %zu", bytes);。如果答案是 0,那么您就知道为什么什么都看不到了。

标签: c tcp stdin


【解决方案1】:

我将fread 线切换为

size_t bytes = read(0, buffer, BUFFSIZE)

这就解决了fread 不返回的问题。不幸的是,这似乎也拿起了回车符,这在我需要删除的缓冲区末尾给了我一个额外的字节。例如,如果我输入'aa'然后输出bytes,它显示的是3而不是2。现在我需要弄清楚如何解决这个问题。

非常欢迎任何更好的答案。谢谢大家。

【讨论】:

  • 几乎所有形式的freadread 都会为您提供换行符。只需修剪缓冲区的末尾即可。类似buffer[bytes--]= '\0'