繁体   English   中英

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

[英]Reading data from a text file with different variable types in C/C++

我正在使用类构建简单的家谱,每个人都有一个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来序列化信息-我必须手动执行此操作,因此,我将感谢“重新发明轮子”方面的一些帮助。 但是,我可以根据需要编辑文件,添加一些定界符。

提前致谢

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM