我的目标是从文件中获取数据,将其拆分并放入数组中以供将来修改。
数据是什么样的:
course1-Maths|course1-3215|number-3|professor-Mark
sam|scott|12|H|3.4|1/11/1991|3/15/2012
john|rummer|12|A|3|1/11/1982|7/15/2004
sammy|brown|12|C|2.4|1/11/1991|4/12/2006
end_Roster1|
我想拿数学,3215,3和马克并放入一个数组, 然后sam scott 12 H 3.4 1/11/1991 3/15/2012。
这是我到目前为止所做的:
infile.open("file.txt", fstream::in | fstream::out | fstream::app);
while(!infile.eof())
{
while ( getline(infile, line, '-') )
{
if ( getline(infile, line, '|') )
{
r = new data;
r->setRcourse_name(line);
r->setRcourse_code(3);//error not a string
r->setRcredit(3);//error not a string pre filled
r->setRinstructor(line);
cout << line << endl;
}
}
}
然后我试着查看它没有存储。
答案 0 :(得分:2)
首先,第1行与其余行非常不同,因此您需要使用不同的解析算法。类似的东西:
bool first = true;
while(!infile.eof())
{
if (first)
{
// read header line
first = false;
}
else
{
// read lines 2..n
}
}
读取第2..n行可以通过为每一行创建一个字符串流来处理,然后使用“|”将其传递到另一个获取行作为一个分隔符,获取每个令牌(sam,scott,12,H,3.4,1 / 11/1991,2012年3月15日)
if (getline(infile, line, '\n'))
{
stringstream ssline(line);
string token;
while (getline(ssline, token, '|'))
vector.push_back(token);
}
读取标题行将完全相同的概念更进一步,然后每个标记用另一个以“ - ”作为分隔符的getline进一步解析。每次第一个令牌(course1,course1,number,教授)都会忽略,并使用第二个令牌(Maths,3215,3,Mark)。
答案 1 :(得分:1)
您完全忽略了嵌套while循环条件下的行。您应该从while循环中的单个位置调用getline,然后使用if-then-else条件序列检查其内容。