程序在开始第二个输入流之前终止

时间:2020-07-22 00:48:59

标签: c++ vector reference

在插入名称之后,然后按 CTRL + D (Unix)或 CTRL + Z 终止输入流。 kbd>(Win),该程序将提示您再次输入年龄,但事实并非如此。拜托,你能告诉我为什么吗?谢谢。

在这里,我使用此代码中没有的打印功能参考。

在线编译https://onlinegdb.com/BkFNcWSgv-以下是相同的代码:↓

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

const vector<string>& read_names(vector<string> &n) {
   for(string temp; cin >> temp;)
      n.push_back(temp);
   return n;
};

const vector<double>& read_ages(vector<double> &a) {
   for(double temp; cin >> temp;)
      a.push_back(temp);
   return a;
};

int main()
{
   vector<string> name;
   vector<string>& nn = name;

   vector<double> age;
   vector<double>& aa = age;


   nn = read_names(name);
   aa = read_ages(age);

   return 0;
}

1 个答案:

答案 0 :(得分:1)

Ctrl + D的行为取决于您的终端。我在VSCode中尝试过,似乎可以关闭输入流。我无法重新打开它。

在我的Linux终端(Tilix)中,Ctrl-D发送EOF。 std::cin.clear()之后,goodbit被设置,我可以再次读取用户输入。 https://en.cppreference.com/w/cpp/io/ios_base/iostate

它在VSCode和Tilix中表现不同。

以下代码对我有用。我不知道Windows,Mac或其他操作系统中的行为。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

const std::vector<std::string>& read_names(std::vector<std::string>& n) {
  for (std::string temp; std::cin >> temp;) n.push_back(temp);
  return n;
}

const std::vector<double>& read_ages(std::vector<double>& a) {
  for (double temp; std::cin >> temp;) a.push_back(temp);
  return a;
}

int main() {
  std::vector<std::string> name;
  std::vector<std::string>& nn = name;

  std::vector<double> age;
  std::vector<double>& aa = age;

  //std::cout << std::cin.rdstate() << '\n';
  nn = read_names(name);
  //std::cout << std::cin.rdstate() << '\n';
  std::cin.clear();
  //std::cout << std::cin.rdstate() << '\n';
  aa = read_ages(age);

  std::cout << nn.size() << '\n';
  std::cout << aa.size() << '\n';
  //std::cout << std::cin.rdstate() << '\n';
  return 0;
}