Windows 上的 EOF 不总是 ^Z 吗?

EOF is not always ^Z on Windows?

#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;
    if (x == EOF)
        cout << x;
    system("pause");
}

在 Windows 上输入 EOF 什么都不输出。而 -1 输出 -1.

这边

#include <iostream>
using namespace std;

int main()
{
    int x;
    if ((x=cin.get()) == EOF)
        cout << x;
    system("pause");
}

在 Windows 上输入 EOF 输出 -1。而 -1 什么都不输出。

现在我完全糊涂了 (我正在使用 Visual Studio 2015 开发 64 位 Windows 7;尽管我认为这不相关)

我还想补充一下,如果 "x" 在两种情况下都被分配了 EOF,那么差异从何而来? 在这两种情况下,我都在比较 "x" 和 EOF 的值,对吗?

EOF是一个扩展为负整数的宏(通常是-1)。

这是 一些 输入函数返回的数字,表示发生了文件结尾。它您的操作系统触发文件结束条件的方式无关(无论是按 ^Z,还是 运行 输入不足,或者随便)。

代码:

int x;
cin >> x

执行格式化输入>><< 运算符用于格式化 I/O。这意味着读取数字的文本表示并将其转换为 int。获得 x == -1 的唯一方法是,如果您实际输入 -1,正如您所发现的那样。

要检测是否发生文件结尾,您可以在读取后通过 cin.eof() 检查流。 (请注意,通常 you should check for all failure modes,而不仅仅是文件结尾)。

此代码:

if ((x=cin.get()) == EOF)
如果发生文件结束,

将匹配,因为 istream::get() 是少数几个通过返回值指示文件结束条件的函数之一。但是,您再次输出 EOF 宏的值,这与您在操作系统中为生成文件结束条件所做的操作无关。