Чтение данных из текстового файла с различными типами переменных в C/C++

Я строю простое генеалогическое древо, используя классы, где у каждого человека есть идентификатор, и у него может быть одно или несколько отношений, и у каждого отношения также есть идентификатор. Я пытаюсь импортировать этот файл, чтобы иметь возможность использовать методы класса для импорта дерева:

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

Для некоторого контекста текстовый файл показывает количество людей в дереве, имя, сын отношения с номером X, пол и ID человека, с которым этот человек имеет отношения. Если у человека нет никаких отношений, отображается "-1". Я увеличиваю идентификаторы автоматически, когда я добавляю человека или отношения через методы класса. Чтобы импортировать файл, я делаю что-то вроде этого:

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 ответа

Решение

Вам нужно позвонить f2.clear() каждый раз, когда цикл завершается, потому что вы используете поток в качестве логического операнда. Поэтому при выходе из цикла появляются флаги ошибок, которые приводят к сбою последующих потоковых операций.

Вам необходимо очистить состояние файлового потока с помощью std::basic_ios::clear() функция внутри внешнего цикла:

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

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

        if (!f2.eof())
            f2.clear();
Другие вопросы по тегам