C++ 如何退出流读取循环,避免额外的空循环?

C++ 如何退出流读取循环,避免额外的空循环?,c++,C++,当程序进入if然后中断时,将再次打印空cout-s void Person::ShowRecords() { std::ifstream data("Input.txt"); while (true) { if (!data.good()) { break; } Person person; data >> person;

当程序进入if然后中断时,将再次打印空cout-s

void Person::ShowRecords()
{
    std::ifstream data("Input.txt");

    while (true)
    {
        if (!data.good())
        {
            break;
        }

        Person person;
        data >> person;
        
        std::cout << "First Name: " << person.getFirstName() << "\n";
        std::cout << "Last Name: " << person.getLastName() << "\n";
        std::cout << "Phone number: " << person.getNumber() << "\n";
        std::cout << "EGN: " << person.getEGN() << "\n\n";
    }
}

我真的认为处理流输入的最有启发性的方法是:

虽然是真的{ //阅读 //检查是否失败,然后断开 //使用 } 注意这个模式:带有Read/Check/Use的无限循环。检查是我们可以退出循环的地方。首先读取,然后检查读取操作是否成功或失败,然后使用数据或基于此退出

根据您的情况进行调整:

void Person::ShowRecords()
{
    std::ifstream data("Input.txt");    
    while (true) {
        // Read
        Person person;
        data >> person;
        // Check
        if (!data) {
            break;
        }
        // Use          
        std::cout << "First Name: " << person.getFirstName() << "\n";
        std::cout << "Last Name: " << person.getLastName() << "\n";
        std::cout << "Phone number: " << person.getNumber() << "\n";
        std::cout << "EGN: " << person.getEGN() << "\n\n";
    }
}
非说教性的,可能更惯用的方式是:

void Person::ShowRecords()
{
    std::ifstream data("Input.txt");    
    Person person;
    while (data >> person) { // Read and, immediately after, Check
        std::cout << "First Name: " << person.getFirstName() << "\n"; // Use
        std::cout << "Last Name: " << person.getLastName() << "\n";
        std::cout << "Phone number: " << person.getNumber() << "\n";
        std::cout << "EGN: " << person.getEGN() << "\n\n";
    }
}

相关/重复:本质上,您需要在data>>person之后检查流状态,而不是在@1201程序之前thanks@AlexandarZhelevwhile true{if!data.good{break;}…}应该是while data.good{…}或者只是while data{…}一个更好的选择是将person的声明移动到循环上方,然后使用while data>>person{…}取而代之。@1201打开文件的程序也会设置流的状态,因此在这种情况下,在检查数据>>person之前检查好还是坏是可以的。但是,在>>之后和使用person之前也应该检查状态。@AlexandarZhelev记住,如果问题解决了,请接受答案。