C++ 如何退出流读取循环,避免额外的空循环?
当程序进入if然后中断时,将再次打印空cout-sC++ 如何退出流读取循环,避免额外的空循环?,c++,C++,当程序进入if然后中断时,将再次打印空cout-s void Person::ShowRecords() { std::ifstream data("Input.txt"); while (true) { if (!data.good()) { break; } Person person; data >> person;
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记住,如果问题解决了,请接受答案。