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

C++ 从C/C+中具有不同变量类型的文本文件读取数据+;,c++,serialization,filestreams,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。要导入文件,我将执行以下操作:

我正在使用类构建一个简单的族谱,其中每个人都有一个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
iff2;
f2.打开(“databasev2.txt”);
字符串名;性别;
int personrelationshipid;国际声频关系;
国际人口;
矢量关系;
f2>>人数;
如果(f2.is_open())
{ 
而(f2>>姓名>>声频关系船舶ID>>性别)
{
而(f2>>personrelationshipid)
{
关系。推回(personrelationshipid);
f2.忽略(0,);
}
//…对变量做些什么
我目前的问题是,循环在第一次迭代后停止。我不确定它是否考虑到第二个名称“Dianaaa”不再是字符串……现在,它正在读取“9”、“Charless”、“0”、“F”、“2”和“5”,并将它们插入向量,然后停止。如果我只有一个关系,则不会发生这种情况(即,如果我拆下5)

此外,我想在名称之间添加空格——为此,我想我只需要创建一个字符串并使用f2.getline(名称,字符串),然后清除缓冲区并删除换行符,这样我就不会在阅读下一行时遇到问题,对吗

我不能使用boost/JSON来序列化信息-我必须手动执行此操作,因此我希望在“重新发明轮子”方面得到一些帮助。但是,我可以根据需要编辑文件,添加一些分隔符


提前感谢

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

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

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

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

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

        if (!f2.eof())
            f2.clear();

您需要在外部循环中使用
std::basic\u ios::clear()
函数清除文件流的状态:

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

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

        if (!f2.eof())
            f2.clear();

解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,应逐行检查代码。有关更多帮助,请阅读。至少应[编辑]您的问题包括一个重现您的问题的示例,以及您在调试器中所做的观察。我确实使用了调试器-这就是我发现它正确读取第一行然后退出程序的原因。我认为,第二个while循环是您的问题。您能将文件减少到2个块和1个关系吗ship?也请尝试f2>>personrelationshipid;不使用while循环?@仅当我有两个关系时,才出现卸载问题。只有一个关系才能正确读取文件。抱歉,意外提交了帖子,无法编辑它-使用f2>>personrelationshipid无效-同样的情况发生,但现在它没有插入两个关系hips进入关系向量。解决此类问题的正确工具是调试器。在询问堆栈溢出之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题包括一个重现您的问题的示例,以及您在调试器中所做的观察。我确实使用了调试器-这就是我发现它正确读取第一行然后退出程序的原因。我认为,第二个while循环是您的问题。您能将文件减少到2个块和1个关系吗ship?也请尝试f2>>personrelationshipid;不使用while循环?@仅当我有两个关系时,才出现卸载问题。只有一个关系才能正确读取文件。抱歉,意外提交了帖子,无法编辑它-使用f2>>personrelationshipid无效-同样的情况发生,但现在它没有插入两个关系hips进入关系向量。谢谢,这就是问题所在-我现在只需要调整几件事!谢谢,这就是问题所在-我现在只需要调整几件事!谢谢,这就是问题所在-我现在只需要调整几件事!谢谢,这就是问题所在-我现在只需要调整几件事!