Ctrl + Z 在 Windows 终端中是如何解释的?

How is Ctrl + Z interpreted in the Windows terminal?

提问人:user589321 提问时间:3/3/2022 最后编辑:user589321 更新时间:3/4/2022 访问量:753

问:

我运行了下面给出的程序。我知道建议使用代替 .while (std::getline(std::cin, inp))while (!std::cin.eof())

#include <iostream>
#include <string>

int main() {

    while (!std::cin.eof()) {

        std::string next_line;
        std::getline(std::cin, next_line);

        if (!std::cin) {
            std::cout << "failbit has been set";
            return 0;
        }

        if (next_line.empty()) {
            std::cout << "input line was empty";
            return 0;
        }

    }

    std::cout << "Success!";

}

下面我给出一些示例输入和程序响应。^Z 表示我输入了 + 。CtrlZ

在第一个示例中,我在两行中键入了两次 +,并看到了在不翻转故障位的情况下到达 EOF 的预期行为。CtrlZ

输入 1:

this is
my input
and this is the
end^Z
^Z

输出 1:

Success!

在第二个示例中,在输入单个 + 后,我能够在输入末尾添加两个额外的换行符,但是,没有切换。CtrlZeofbit

输入 2:

this is
my input
and this is the
end^Z



输出 2:

input line was empty

在第三个示例中,我看到了正在设置的故障位的预期输出。我的理解是,如果 + 是 EOF,应该设置 的 ,但还没有设置 .这是基于此处的第 2 (a) 行。在正常输入下不应给出“failbit has been set”输出。std::cinCtrlZstd::getlineeofbitstd::cinfailbit

输入 3:

this is
my input
and this is the
end
^Z

输出 3:

failbit has been set

在这些示例中,+ 在做什么?CtrlZ

C++ 终端 CIN EOF GetLine

评论

0赞 user589321 3/3/2022
@Damien实际的问题不是标题,而是帖子底部的问题:“Ctrl+ Z 在这些示例中都做了什么?在我看来,我的输入中的每个 ^Z 似乎都充当 EOF。(此外,我读过的一些帖子表明没有 EOF 字符,并且 EOF 是在输入结束时达到的状态......或类似的东西。
1赞 Jerry Jeremiah 3/3/2022
在 Windows 中,如果输入本身出现在一行上,则输入的末尾是 ^Z。如果它本身不在一条线上,那么它只是一个普通字符。在 Linux 上,等价物是 ^D。这可能会有所帮助: devblogs.microsoft.com/oldnewthing/20040316-00/?p=40233
0赞 user589321 3/3/2022
@JerryJeremiah 谢谢,这很有帮助,但我不明白为什么输入 2 会以这种方式工作。为什么允许我输入空行而不触发“输入行为空”?
0赞 user589321 3/3/2022
此外,为什么输入 1 和 3 给出不同的输出?
0赞 palapapa 9/28/2022
@user589321 它不会打印“输入行为空”,因为您返回时,所以它从来没有机会打印它!std::cin

答: 暂无答案