在 C/C++ 中从具有不同变量类型的文本文件中读取数据
Reading data from a text file with different variable types in C/C++
我正在使用 classes 构建一个简单的家谱,其中每个人都有一个 ID,可以有一个或多个关系,每个关系也有一个 ID。我正在尝试导入此文件以便能够使用 class 方法导入树:
9
Charless
0
F
2 5
Dianaaaa
0
M
1
William
1
M
6
Harry
1
M
-1
...
对于某些上下文,文本文件显示树中的人数、姓名、关系编号 X 的儿子、性别以及与此人有关系的人的 ID。如果此人没有任何关系,则显示“-1”。当我通过 class 方法添加一个人或一个关系时,我会自动增加 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 来序列化信息 - 我必须手动执行此操作,因此我希望 "reinventing the wheel" 能提供一些帮助。但是,我可以根据需要编辑文件,添加一些分隔符。
提前致谢
您需要在每次循环退出时调用 f2.clear()
,因为您将流用作布尔操作数。因此,当循环退出时,会出现导致后续流操作失败的错误标志。
你需要清除文件流的状态,用std::basic_ios::clear()
函数,在外层循环内:
while (f2 >> name >> sonofrelationshipid >> gender)
{
while (f2 >> personrelationshipid)
{
relationships.push_back(personrelationshipid);
}
if (!f2.eof())
f2.clear();
我正在使用 classes 构建一个简单的家谱,其中每个人都有一个 ID,可以有一个或多个关系,每个关系也有一个 ID。我正在尝试导入此文件以便能够使用 class 方法导入树:
9
Charless
0
F
2 5
Dianaaaa
0
M
1
William
1
M
6
Harry
1
M
-1
...
对于某些上下文,文本文件显示树中的人数、姓名、关系编号 X 的儿子、性别以及与此人有关系的人的 ID。如果此人没有任何关系,则显示“-1”。当我通过 class 方法添加一个人或一个关系时,我会自动增加 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 来序列化信息 - 我必须手动执行此操作,因此我希望 "reinventing the wheel" 能提供一些帮助。但是,我可以根据需要编辑文件,添加一些分隔符。
提前致谢
您需要在每次循环退出时调用 f2.clear()
,因为您将流用作布尔操作数。因此,当循环退出时,会出现导致后续流操作失败的错误标志。
你需要清除文件流的状态,用std::basic_ios::clear()
函数,在外层循环内:
while (f2 >> name >> sonofrelationshipid >> gender)
{
while (f2 >> personrelationshipid)
{
relationships.push_back(personrelationshipid);
}
if (!f2.eof())
f2.clear();