繁体   English   中英

Windows 7中的(C / C ++)EOF

[英](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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM