OS/X 上的 Control-D 后如何继续从标准输入读取
How to continue reading from stdin after Control-D on OS/X
我想使用 EOF 终止读取批量用户输入,但继续能够接受用户 CLI 输入。
似乎 Linux 允许这种行为,但是 OS/X 只是简单地关闭了标准输入流(从下面的测试程序看来)。
是否有任何解决方法可以在 OS/X 上运行?
运行 在 MAC OS/X 上的示例输出。一旦检测到 EOF,就不能进行任何输入。 (以 >>> 开头的行是程序的输出)。
TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz
>>> read stdin again, fgets:
zzz
>>> ans=zzz
TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
>>> ans=
Linux 上 运行 的示例输出。即使在检测到 EOF 之后也接受输入。 (以 >>> 开头的行是程序的输出)。
[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz
>>> read stdin again, fgets:
zzz
>>> ans=zzz
[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
zzz
>>> ans=zzz
这里是示例测试程序:
#include<stdio.h>
int main(void)
{
char ans[80];
//
// read from stdin
printf(">>> fgets: "); fflush(stdin);
fgets(ans, sizeof(ans), stdin);
printf(">>> ans=%s\n", ans);
if (feof(stdin)) {
printf(">>> feof(stdin) is true -- EOF detected\n");
}
//
// continue read from stdin
printf(">>> read stdin again, fgets: \n");
fgets(ans, sizeof(ans), stdin);
printf(">>> ans=%s\n", ans);
return 0;
}
检测到 EOF 后,您可以调用标准输入输出函数 clearerr(stdin)
或 clearerr_unlocked(stdin)
,以清除 stdin
流上的 EOF 状态 - man 3 clearerr
了解更多详情.
HTH
我想使用 EOF 终止读取批量用户输入,但继续能够接受用户 CLI 输入。
似乎 Linux 允许这种行为,但是 OS/X 只是简单地关闭了标准输入流(从下面的测试程序看来)。
是否有任何解决方法可以在 OS/X 上运行?
运行 在 MAC OS/X 上的示例输出。一旦检测到 EOF,就不能进行任何输入。 (以 >>> 开头的行是程序的输出)。
TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz
>>> read stdin again, fgets:
zzz
>>> ans=zzz
TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
>>> ans=
Linux 上 运行 的示例输出。即使在检测到 EOF 之后也接受输入。 (以 >>> 开头的行是程序的输出)。
[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz
>>> read stdin again, fgets:
zzz
>>> ans=zzz
[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
zzz
>>> ans=zzz
这里是示例测试程序:
#include<stdio.h>
int main(void)
{
char ans[80];
//
// read from stdin
printf(">>> fgets: "); fflush(stdin);
fgets(ans, sizeof(ans), stdin);
printf(">>> ans=%s\n", ans);
if (feof(stdin)) {
printf(">>> feof(stdin) is true -- EOF detected\n");
}
//
// continue read from stdin
printf(">>> read stdin again, fgets: \n");
fgets(ans, sizeof(ans), stdin);
printf(">>> ans=%s\n", ans);
return 0;
}
检测到 EOF 后,您可以调用标准输入输出函数 clearerr(stdin)
或 clearerr_unlocked(stdin)
,以清除 stdin
流上的 EOF 状态 - man 3 clearerr
了解更多详情.
HTH