C++ 输入有问题

C++ 输入有问题,c++,string,validation,C++,String,Validation,我的输入文件由两行组成,其中的数字用空格分隔。我必须从两行中读取数字,并将它们存储在两个不同的std::Vector中。但我不知道每行有多少个数字。如何确保在阅读第一行时,我不会同时阅读第二行的数字?我尝试将它们作为字符串读取并检查\n字符,但无效 cin>>str; while(str[0]!='\n' && str!="") { sscanf(str.c_str(),"%d",&num); numz.pus

我的输入文件由两行组成,其中的数字用空格分隔。我必须从两行中读取数字,并将它们存储在两个不同的std::Vector中。但我不知道每行有多少个数字。如何确保在阅读第一行时,我不会同时阅读第二行的数字?我尝试将它们作为字符串读取并检查\n字符,但无效

    cin>>str;
    while(str[0]!='\n' && str!="") {
        sscanf(str.c_str(),"%d",&num); 
        numz.push_back(num); //numz is the vector for the first line of numbers
        cin>>str;
    }
有什么好方法可以做到这一点吗?

包括访问std::istringstream。 那么代码应该如下所示:

std::string line1;
std::string line2;

std::getline(std::cin, line1);
std::getline(std::cin, line2);

int x;
std::vector<int> v;
std::istringstream iss(line1);
while (iss >> x) {
    v.push_back(x);
}
首先,我们使用getline读取这两行,然后创建一个istringstream对象,它的工作原理与std::cin一样。

包含以访问std::istringstream。 那么代码应该如下所示:

std::string line1;
std::string line2;

std::getline(std::cin, line1);
std::getline(std::cin, line2);

int x;
std::vector<int> v;
std::istringstream iss(line1);
while (iss >> x) {
    v.push_back(x);
}

首先,我们使用getline读取这两行,然后创建一个istringstream对象,它的工作原理与std::cin一样。

下面将一行读取到向量中。当然,您应该添加错误检查

std::vector<int> readnumline(std::istream& is)
{
  std::string line;
  std::getline(is, line);
  std::istringstream iss(line);
  int num;
  std::vector<int> result;
  while(iss >> num)
    result.push_back(num);
  return result;
}
要读取两个向量,可以使用

std::vector<int> v1(readnumline(std::cin));
std::vector<int> v2(readnumline(std::cin));

下面将一行读入向量。当然,您应该添加错误检查

std::vector<int> readnumline(std::istream& is)
{
  std::string line;
  std::getline(is, line);
  std::istringstream iss(line);
  int num;
  std::vector<int> result;
  while(iss >> num)
    result.push_back(num);
  return result;
}
要读取两个向量,可以使用

std::vector<int> v1(readnumline(std::cin));
std::vector<int> v2(readnumline(std::cin));

你能指定我如何从这些中获取数字吗?使用strtok?你能不能指定我如何从中获取数字?使用strtok?一切都开始得很好…,但实际读取向量可以简化一点,或者至少从代码中删除循环:/*…*/std::istringstream issline;返回std::vectorstd::istream\u迭代器,std::istream\u迭代器@DavidRodríguez dribeas:虽然该版本较短,但很难添加正确的错误处理,例如,您需要检查是否实际使用了完整的行;您当然不想将解析放在return语句中。而且,我不认为循环是邪恶的。如果没有给istream_迭代器起这么长的名字,我肯定会更频繁地使用它们;-也许他们应该为流提供模板化的begin/end,这样您就可以编写iss.begin和iss.end。不久前,在标准邮件列表中讨论了begin/end的可能添加,特别是其目的是支持基于范围的迭代。它似乎不适合于没有模板参数可以传递的特定用例,不确定是否会更好地接受这种模板化方法,但如果是这种情况,我会感到惊讶,因为这将是一件新的不同的事情。一切都开始得很好。。。,但是对向量的实际读取可以简化一点,或者至少可以从代码中删除循环:/*…*/std::istringstream issline;返回std::vectorstd::istream\u迭代器,std::istream\u迭代器@DavidRodríguez dribeas:虽然该版本较短,但很难添加正确的错误处理,例如,您需要检查是否实际使用了完整的行;您当然不想将解析放在return语句中。而且,我不认为循环是邪恶的。如果没有给istream_迭代器起这么长的名字,我肯定会更频繁地使用它们;-也许他们应该为流提供模板化的begin/end,这样您就可以编写iss.begin和iss.end。不久前,在标准邮件列表中讨论了begin/end的可能添加,特别是其目的是支持基于范围的迭代。它似乎不适合于没有模板参数可以传递的特定用例,不确定是否会更好地接受这种模板化方法,但如果是这种情况,我会感到惊讶,因为这将是一件新的不同的事情。