(C / C ++)EOF在Windows7中

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

当我运行这个程序时,一些意外的行为发生在^ Z(Ctrl + z)上,我将用它来表示EOF。

我input“hello \ n”执行'fcopy'中的while循环来打印相同的内容。

“^ Z \ n”结束程序。

但是,如果我input“blahblah ^ Zasdfasdf \ n”,而我期望程序打印“blahblah”并终止,它会用一个小箭头打印“blahblah→”,等待我的input。 无论我在这里写下什么,都会被复制下来。 它似乎重新执行循环,同时删除'^ Z'后写的任何东西。

 in: hello out: hello in: hello^Z out/in: hello→?? // "??" is my input out: ?? in: ^Z termination 

任何人都可以请澄清为什么程序这样工作? 感谢您的帮助,提前。

一般来说,我希望你应该等待^ Z而不是EOF。 ^ Z是0x1A的ASCII字符( http://en.wikipedia.org/wiki/Substitute_character )。 此外,你也一定要检查EOF,因为文件可以结束没有 ^ Z

似乎由于某种原因,控制台应用程序将^ Z解释为EOF,当行是空的(我不知道为什么 – 但这可能是合法的行为或简单的错误,如https://connect.microsoft.com/VisualStudio / feedback / details / 798951 / c-getc-breaks-when-encounters-character-26-or-1a-hex-ascii-sub )

但是下面的代码修复了它:

 #include <cstdio> #define CTRL_Z_SUB 0x1A // CTRL_Z substitue ASCII key void fcopy(FILE* from, FILE* to); int main() { fcopy(stdin, stdout); return 0; } void fcopy(FILE* from, FILE* to) { int c = getc(from); while (c != EOF && c != CTRL_Z_SUB) { putc(c, to); c = getc(from); } } 

这是因为Windows终端程序正在读取您的键盘输入并将其传递到您的程序,正在处理Ctrl + Z。 这只意味着在一行开始时按下“输入信号结束”。

请注意,C中的EOF不代表实际的(“物理”)字符,它是带外信号,表示“没有要读取的字符,因为文件已经结束”。