我有一个文件:
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();
}
我需要检查stud [i] .Grade1是否为int。如果不是它返回false。 文件可以包含:
name1 haha
name2 27
name3 6
我该怎么做?
编辑:
我尝试过另一种方式(没有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();
}
答案 0 :(得分:1)
如果Grade1
的数字类型为int
,请使用std::istringstream::fail()
:
// ...
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();
}
// ...
答案 1 :(得分:1)
看起来像这样:
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);
}
请注意iss >> s.Grade1
不仅会对小数成功,也会对八进制和十六进制数成功。为了确保只读取十进制值,您可以将其读入临时std::string
对象并在使用它来检索数字之前对其进行验证。看看How to determine if a string is a number with C++?