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);
}