在C / C ++中从具有不同变量类型的文本文件中读取数据

时间:2016-12-27 13:16:55

标签: c++ serialization filestreams

我正在使用类构建一个简单的族树,其中每个人都有一个ID并且可以有一个或多个关系,每个关系也有一个ID。我正在尝试导入此文件,以便能够使用类方法导入树:

9
Charless 
0 
F
2 5
Dianaaaa 
0 
M
1
William 
1 
M
6 
Harry 
1 
M
-1 
... 

对于某些上下文,文本文件显示树中的人数,姓名,关系编号X的子,性别以及此人与之关系的人的ID。如果该人没有任何关系,则显示“-1”。当我通过类方法添加人或关系时,我会自动递增ID。要导入文件,我正在做这样的事情:

ifstream f2;
f2.open("databasev2.txt");
string name; char gender;
int personrelationshipid; int sonofrelationshipid;
int numberOfPeople;
vector<int>relationships;
f2 >> numberOfPeople;
if (f2.is_open())
{ 
while (f2 >> name >> sonofrelationshipid >> gender )
{

    while (f2 >> personrelationshipid)
    {
        relationships.push_back(personrelationshipid);
        f2.ignore(0, ' '); 
    }
//...do something with the variables

我当前的问题是循环在第一次迭代后停止。我不确定它是否考虑到第二个名字“Dianaaa”不再是一个字符串...现在,它正在读“9”,“Charless”,“0”,“F”,“2”和“ 5“,并将它们插入矢量,然后停止。如果我只有一个关系,这不会发生(即如果我删除了5)

此外,我想在它们之间添加带空格的名称 - 为此,我想我只需要创建一个字符串并使用f2.getline(name,string),然后清除缓冲区并删除换行符我在阅读下一行时没有遇到任何问题,对不对?

我不能使用boost / JSON来序列化信息 - 我必须手动执行此操作,所以我会很感激“重新发明轮子”的一些帮助。但是,我可以根据需要编辑文件,添加一些分隔符。

提前致谢

2 个答案:

答案 0 :(得分:2)

每次循环退出时都需要调用f2.clear(),因为您将流用作布尔操作数。因此,当循环退出时,会出现错误标志,导致后续流操作失败。

答案 1 :(得分:2)

您需要在外部循环内使用std::basic_ios::clear()函数清除文件流的状态:

    while (f2 >> name >> sonofrelationshipid >> gender)
    {

        while (f2 >> personrelationshipid)
        {
            relationships.push_back(personrelationshipid);
        }

        if (!f2.eof())
            f2.clear();
相关问题