如何在不破坏外部 while(cin>>s1) 循环的情况下打破内部 while(cin>>s2) 循环?

How to break the inner while(cin>>s2) loop without breaking the outter while(cin>>s1) loop?

请考虑以下 C++ 代码:

#include <string>
#include <iostream>
using namespace std;

void fun1() {
  cout << "Calling fun1" << endl;
}
void fun2() {
  cout << "Calling fun2" << endl;
}

int main() {
  string s1, s2;
  while (cin >> s1) {
    fun1();
    while (cin >> s2) {
      fun2();
    }
  }
  return 0;
}

代码有两个嵌套的while循环,在外层while循环中,使用cin输入一个值并调用fun1;然后进入内层while循环,用cin输入一个值调用fun2。但是当我想通过 ctrl + d 终止内部 while 循环时,我发现外部 while 循环也终止了。我知道我可以使用下面的代码片段来解决这个问题,但我想知道为什么会出现上述情况?提前致谢。

  while (cin >> s1) {
    if (s1 == "end1")
      break;
    fun1();
    while (cin >> s2) {
      if (s2 == "end2")
        break;
      fun2();
    }
  }

but I want to know why does the above happen?

当您按下 Ctrl-DCtrl-Z on Windows)时,您关闭了流,因此 std::cin status returns false 并且内部循环终止。当您使用相同的流 - std::cin 在两个循环中并且流已经关闭时,它会终止它们,因为这种状态是持久的。可行的解决方案不是关闭而是使用一些标记来终止内部循环,这样它就不会影响外部循环,就像您在第二个示例中所做的那样。