[英](C/C++) EOF in 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。
我输入的“ 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
任何人都可以澄清一下该程序为什么这样工作吗? 预先感谢您的帮助。
这是因为Windows终端程序正在处理Ctrl + Z ,即读取键盘输入并将其传递给程序。 在一行的开始处按下时,仅表示“输入信号结束”。
请注意,C中的EOF
并不代表实际的(“物理”)字符,它是带外信号,指示“由于文件已结束,因此没有要读取的字符”。
通常,我希望您应该等待^ 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遇到字符26或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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.