尝试将文本文件数据读入要操作的数组,然后吐出

时间:2012-05-13 15:37:27

标签: c++ visual-c++

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

数据是什么样的:

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

然后我试着查看它没有存储。

2 个答案:

答案 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条件序列检查其内容。