C++ - 为什么cin.eof()读取最后一次char两次?

rAg*_*Age 3 c++ cin eof

可能重复:
为什么循环条件中的iostream :: eof被认为是错误的?


我有一个非常简单的问题......

#include<iostream>
using namespace std;
int main()
{
    char x;
    while(!cin.eof())
    {
        cin>>x;
        cout<<"char: "<< x << endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


为什么当我尝试在Linux上运行此代码时:
./ file_name <test_file.txt
结果是:
char:一个
char:b
char:c
char:d
char:d
当test_file.txt仅为:
abcd

Che*_*Alf 10

输入操作失败会检测到文件结尾.

所以,在

    cin>>x;
    cout<<"char: "<< x << endl;
Run Code Online (Sandbox Code Playgroud)

即使输入操作失败,也会执行输出语句.

当它失败时,它不会更新x.

而不是测试.eof(),测试.fail().

您可以通过直接使用流对象作为条件来实现,例如

#include<iostream>
using namespace std;
int main()
{
    char x;
    while( cin >> x )
    {
        cout<<"char: "<< x << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里表达式cin >> x执行可能更新的输入操作x,并且其表达式结果返回对流的引用,即to cin.因此cin被直接用作条件.这将调用转换为布尔值,布尔值被定义为使其本身等效!cin.fail()(即,表达式cin >> x作为条件等同于写入!(cin >> x).fail()或作为逗号表达式(cin >> x, !cin.fail())).