1

我的目标是从文件中获取数据,将其拆分并将它们放入一个数组中以供将来修改。

这是数据的样子:

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 和 Mark 放入一个数组中,然后 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;
        }
    }
}

然后我试图查看它没有存储任何内容。

4

2 回答 2

2

首先,第 1 行与其余行非常不同,因此您需要为它们使用不同的解析算法。就像是:

bool first = true;
while(!infile.eof()) 
    {
        if (first) 
            {
            // read header line
            first = false;
            }
        else 
            {
            // read lines 2..n
            }   
    }

可以通过为每行创建一个字符串流来处理读取第 2..n 行,然后使用 '|' 将其传递给另一个 getline 作为分隔符,获取每个令牌 (sam, scott, 12, H, 3.4, 1/11/1991, 3/15/2012)

if (getline(infile, line, '\n')) 
    {
    stringstream ssline(line);
    string token;
    while (getline(ssline, token, '|'))
        vector.push_back(token);
    }

阅读标题行将完全相同的概念更进一步,其中每个标记然后用另一个以“-”作为分隔符的 getline 进一步解析。您每次都会忽略第一个标记(course1、course1、number、professor)并使用第二个标记(Maths、3215、3、Mark)。

于 2012-05-13T17:46:06.067 回答
1

您完全忽略了在嵌套 while 循环的条件内获得的行。您应该从 while 循环中的一个位置调用 getline,然后使用一系列 if-then-else 条件检查其内容。

于 2012-05-13T15:43:18.137 回答