作为一个小背景,我对 C 编程语言还很陌生,因此一直在尝试完成 Kernighan & Ritchie 手册第二版中的一些练习。我确实意识到,通过更多地使用标准库,我可能可以更简洁地处理某些问题,但我正在努力使我的有用命令库尽可能与本书保持同步。
如果有所不同,我正在使用 Tiny C 编译器 (TCC) 在 Windows XP 环境中编译我的源代码,并在 XP 控制台 (cmd.exe) 中执行二进制文件。
问题:处理文件结束 (EOF) 字符
。我整理了一个小测试用例来说明这个问题。该程序似乎(部分)处理了 EOF 字符。我将尝试使用示例输入/输出来演示该问题。
#include <stdio.h>
int main()
{
int character, count;
character = 0;
character = getchar();
for (count = 0; character != EOF; ++count)
{
character = getchar();
}
printf("Count: %d", count);
return 0;
}
示例输入 1:abcd^Z[enter]
(其中 ^Z/CTRL+Z 代表 EOF 字符,[enter] 代表回车键。)
示例输出 1:计数:4
(等待更多输入或在 ^C/^Z[enter] 上正确结束)
示例输入 2:abcd^Zefgh
示例输出 2:计数:4
(等待更多输入或在 ^C/^Z[enter] 上正确结束)
正如在这两个示例中所指出的,字符计数在启动 ^C/^Z[enter] 序列之前不会输出。在启动之前,程序会等待(实际上是处理)更多输入。但是,如示例 2 中所述,当程序遇到初始 ^Z 时,它会停止处理该行输入,等待更多输入或在启动 ^C/^Z[enter] 序列时返回正确的计数。
我不明白为什么程序只部分处理 EOF 字符。在我看来,如果它截断样本 2 的末尾,它也应该完全跳出循环。为什么程序在识别到 EOF 字符后不会立即打印当前计数并退出?有什么想法吗?
最佳答案
这个答案是 unix-ish,但我认为类似的现象正在 Windows 上发生。 EOF 的基本形式是零长度的read
。在交互式输入设备(终端)上,有一种在输入流中包含 EOF 的特殊机制,但如果已经有要读取的输入,它将与该输入一起被消耗(导致非零长度 read
),因此应用程序永远不会注意到。只有当 EOF 发生时没有预先缓冲输入,应用程序才能注意到它并采取行动。
如果您可以访问 Linux(或其他 *nix)系统,请编写类似的测试程序并在 strace
下运行它。观察发生的底层 read
调用,就会明白造成这种不直观行为的原因。
关于c - 为什么我需要多个 EOF (CTRL+Z) 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655112/