#include <cstdio>
void fcopy(FILE* from, FILE* to);
int main()
{
fcopy(stdin, stdout);
return 0;
}
void fcopy(FILE* from, FILE* to)
{
int c;
while ((c = getc(from)) != EOF) {
putc(c, to);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,^ Z(Ctrl + z)会发生一些意外的行为,我会用它来表示EOF.
我输入的"hello \n"执行'fcopy'中的while循环来打印相同的内容.
"^ Z \n"结束程序.
但是如果我输入"blahblah ^ Zasdfasdf \n",而我期望程序打印"blahblah"并终止,它会用一个小箭头打印"blahblah→"并等待我的输入.无论我在这里写下什么都将被完全复制下来; 它似乎重新执行循环,同时切掉'^ Z'之后写的任何东西.
in: hello
out: hello
in: hello^Z
out/in: hello??? // "??" is my input
out: ??
in: ^Z
termination
Run Code Online (Sandbox Code Playgroud)
任何人都可以澄清为什么程序以这种方式工作?提前感谢您的帮助.
这是因为Windows终端程序正在读取您的键盘输入并将其传递给您的程序,Ctrl+Z就像这样处理.它只表示在一行开始时按下"信号输入结束".
请注意,EOF在C中并不表示实际("物理")字符,它是带外信令,表示"由于文件已结束,因此没有要读取的字符".