C 将stdin复制到缓冲区
在网络项目中工作,并使用select()和FD_ISSET同时监视stdin和TCP连接。我似乎无法在缓冲区中捕获键盘条目以便处理它。以下是我所拥有的:C 将stdin复制到缓冲区,c,tcp,stdin,C,Tcp,Stdin,在网络项目中工作,并使用select()和FD_ISSET同时监视stdin和TCP连接。我似乎无法在缓冲区中捕获键盘条目以便处理它。以下是我所拥有的: if (FD_ISSET(0, &read_set)) { fprintf(stdout, "Keyboard input noted:\n"); size_t bytes = fread(buffer, sizeof(char), BUFFSIZE, stdin); fwrite(buffer, sizeo
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);
}
然后输入类似于
aa
的内容,我可以强制它输出,但这太小了。当读取回车键时,我需要一种方法使其从fread返回。我将fread
行切换为
size_t bytes = read(0, buffer, BUFFSIZE)
这就解决了fread
不返回的问题。不幸的是,这似乎也拾取了回车字符,这在缓冲区的末尾给了我一个额外的字节,我需要删除它。例如,如果我输入'aa',然后输出字节
,它将显示3而不是2。现在我需要弄清楚如何解决这个问题
任何更好的答案都是非常受欢迎的。感谢大家。尝试将
字节写入stderr。您是否点击了中断
?@woolstar我将fwrite行更改为fwrite(缓冲区,大小(字符,字节,stderr);
-仍然没有output@BitFiddlingCodeMonkey我在中断
之前添加了一行输出。似乎我没有到达这里。打印字节
:fprintf(stderr,“字节读取=%zu”,字节)如果答案是0,你就知道为什么什么都看不到。几乎所有形式的fread
和read
都会给你换行符。只需修剪缓冲区的结尾。类似于buffer[bytes-->='\0'
size_t bytes = read(0, buffer, BUFFSIZE)