gpt4 book ai didi

C - 标准输入、unix 管道和 EOF

转载 作者:太空宇宙 更新时间:2023-11-04 05:50:41 27 4
gpt4 key购买 nike

我正在编写一个应用程序,它首先从 unix 管道接收数据,然后提示用户输入。我似乎无法弄清楚为什么在提示用户输入之前管道的输入似乎没有正确关闭。感觉好像我在这里遗漏了一些非常基本的东西。

我已经尝试了所有刷新标准输入的示例 here没有成功。 This似乎也可能相关,但我没有设法提取任何相关答案。

#include <stdio.h>
#include <stdlib.h>

#define BUFSZ 1024

int main(void) {

char *buf = calloc(BUFSZ, sizeof(char));

while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }

printf("Enter input: ");
fgets(buf, BUFSZ, stdin);
printf("User input: %s", buf);

free(buf);
return 0;
}

示例用法和输出:

$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: User input: testdata testdata7
$

为什么第二个 fgets()(用于键盘输入)从不接触缓冲区?

此 MCVE 已在 OSX 和 Linux 上进行编译测试,结果相同。

最佳答案

如果 stdin 是一个管道,那么 stdin 就不是终端。当你到达管道的尽头时,就是这样! stdin 到此结束。您期待某种神奇的转变,其中 stdin 不再是管道,而是开始成为其他东西。不要指望那样。还是那根 pipe 。并且发生了EOF。对于管道,EOF 是永久状态。一旦达到 EOF,您将不会再得到任何东西。

请检查fgets 每次 的返回值。您会看到最后一个返回 null,因为它在 EOF。

想要读取管道 stdin 并获得键盘输入的程序必须单独打开终端,如 FILE *tty = fopen("/dev/tty", "r") ;

关于C - 标准输入、unix 管道和 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com