(C/C++)windows7中的EOF

xiv*_*r77 1 c c++ windows

#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)

任何人都可以澄清为什么程序以这种方式工作?提前感谢您的帮助.

unw*_*ind 5

这是因为Windows终端程序正在读取您的键盘输入并将其传递给您的程序,Ctrl+Z就像这样处理.它只表示在一行开始时按下"信号输入结束".

请注意,EOF在C中并不表示实际("物理")字符,它是带外信令,表示"由于文件已结束,因此没有要读取的字符".