从事网络项目并使用 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<enter>
的内容我可以强制它输出,但这太小了。我需要一种方法让它在读取回车键时从 fread 返回。
最佳答案
我将 fread
行切换为
size_t bytes = read(0, buffer, BUFFSIZE)
这样就解决了 fread
不返回的问题。不幸的是,这似乎也拾取了回车符,这在我需要删除的缓冲区末尾给了我一个额外的字节。例如,如果我输入 'aa' 然后输出 bytes
,它显示 3 而不是 2。现在我需要弄清楚如何解决这个问题。
非常欢迎任何更好的答案。感谢大家。
关于将标准输入复制到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366468/