C++ 使用getline拆分字符串并检查int

C++ 使用getline拆分字符串并检查int,c++,parsing,vector,getline,C++,Parsing,Vector,Getline,我有一个文件: name1 8 name2 27 name3 6 我把它解析成向量。这是我的代码: int i=0; vector<Student> stud; string line; ifstream myfile1(myfile); if (!myfile1.is_open()) {return false;} else { while( getline(myfile1, line) ) { istringstream iss(l

我有一个文件:

name1 8
name2 27
name3 6
我把它解析成向量。这是我的代码:

  int i=0;
  vector<Student> stud;

  string line;
  ifstream myfile1(myfile);
  if (!myfile1.is_open()) {return false;}
  else {
    while( getline(myfile1, line) ) {
      istringstream iss(line);
      stud.push_back(Student());
      iss >> stud[i].Name >> stud[i].Grade1;
      i++;
    }
    myfile1.close();
  }
我怎么做

编辑:

我尝试了另一种方法(没有getline),它似乎有效。我不明白为什么:/

int i=0;
vector<Student> stud;

ifstream myfile1(myfile);
if (!myfile1.is_open()) {return false;}
else {
  stud.push_back(Student());
  while( myfile1 >> stud[i].Name ) {
    if(!(myfile1 >> stud[i].Points1)) return false;
    i++;
    stud.push_back(Student());
}
myfile1.close();
}
inti=0;
矢量螺柱;
ifstream myfile1(myfile);
如果(!myfile1.is_open()){return false;}
否则{
螺柱。推回(学生());
while(myfile1>>stud[i].Name){
如果(!(myfile1>>stud[i].Points1))返回false;
i++;
螺柱。推回(学生());
}
myfile1.close();
}

如果数值形式的
等级1
类型如
int
,请使用
std::istringstream::fail()


它可能是这样的:

std::vector<Student> students;
std::ifstream myfile1(myfile);
if (!myfile1.is_open())
    return false;

std::string line;
while (std::getline(myfile1, line))
{
    // skip empty lines:
    if (line.empty()) continue;

    Student s;
    std::istringstream iss(line);
    if (!(iss >> s.Name))
        return false;
    if (!(iss >> s.Grade1))
        return false;

    students.push_back(s);
}
std::矢量学生;
std::ifstream myfile1(myfile);
如果(!myfile1.is_open())
返回false;
std::字符串行;
while(std::getline(myfile1,line))
{
//跳过空行:
如果(line.empty())继续;
学生证;
标准::istringstream iss(线);
如果(!(iss>>s.Name))
返回false;
如果(!(iss>>s.Grade 1))
返回false;
学生们,往后推;
}

请注意,
iss>>s.Grade1
不仅适用于十进制数,也适用于八进制和十六进制数。为了确保只读取十进制值,可以将其读入临时
std::string
对象,并在使用它检索数字之前对其进行验证。看看

我以前试过,但它总是返回false。即使有数字。
Grade1
的类型是什么?它是内部结构代码:struct Student{string Name;int Grade1,Grade2;//Student(string Name,int Grade1,int Grade2);};如您所见,我在两个单独的语句中使用了
iss>.
,我认为这很重要。测试我的代码。啊,对不起,我没有看到它。它起作用了!谢谢但若我有一行:name427d我忘了提那个,那个么肯定只有一个数字。
// ...
    while( getline(myfile1, line) ) {
      istringstream iss(line);
      stud.push_back(Student());
      iss >> stud[i].Name;
      iss >> stud[i].Grade1;
      if (iss.fail())
        return false;
      i++;
    }
    myfile1.close();
  }
// ...
std::vector<Student> students;
std::ifstream myfile1(myfile);
if (!myfile1.is_open())
    return false;

std::string line;
while (std::getline(myfile1, line))
{
    // skip empty lines:
    if (line.empty()) continue;

    Student s;
    std::istringstream iss(line);
    if (!(iss >> s.Name))
        return false;
    if (!(iss >> s.Grade1))
        return false;

    students.push_back(s);
}