Структура довольно проста:
- Основная мысль
- Элемент списка - 5
- Элемент списка - 6
- ...
- Основная мысль
- Элемент списка - 2
- Элемент списка - 3
- ...
Чтобы было удобнее читать, я добавил несколько разделителей, вот фактический файл:
>Point one
item 1 | 150
item 2 | 20
>Point two
item 1 | 150
item 2 | 10
И я написал функцию C ++, которая должна читать ее. Но я где-то запутался в собственной логике и допустил ошибку. Может найти его для меня?
ifstream fileR("file.txt");
int i = 0;
getline(fileR, sTemp);
do {
if(!sTemp.empty() && sTemp[0]==DELIM){
R[0][i] = sTemp.substr(1);
i++;
}else{
j = 0;
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[j+1][i].set(trim(name), amount);
j++;
}else{
break;
}
}while(getline(fileR, sTemp));
}
}while(getline(fileR, sTemp));
Где передаются считанные значения, не важно, потому что я пытался упростить эту функцию, потому что это на самом деле некоторые контейнеры с динамическими массивами. Я проверил их, и они работают нормально. Так что есть проблема с чтением. Это хорошо, чтобы прочитать первое значение хорошо, но потом это делает некоторый беспорядок.
Если вы считаете мою попытку полной катастрофой, я бы приветствовал подсказки о том, как сделать действительно работающую функцию.
EDIT:
У меня хороший ночной сон, и я исправил это. Вот вариант работы:
bool read = true;
for(int i = 0; i<n; i++) {
if(read){getline(fileR, sTemp);}else{ read = true; }
if(!sTemp.empty() && sTemp[0]==DELIM){
R[i].setName(sTemp.substr(1));
i--;
}else{
R[i].toFirstSubpoint();
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[i].setSubpoint(trim(name), amount);
R[i].toNextSubpoint();
}else{
read = false;
break;
}
}while(getline(fileR, sTemp));
}
Моя самая важная ошибка заключалась в том, что я забыл, что если после проверки условия цикл переходит к следующему индексу и не выполняет его (другое) условие.
Ответ, приведенный ниже, на самом деле является лучшим способом сделать это гораздо проще и проще для понимания, но я не смог бы использовать векторы на этот раз, и я предполагаю, что мой сценарий должен быть немного быстрее, поскольку он не использует их. В любом случае, в следующий раз, когда я столкнусь с подобной ситуацией, я воспользуюсь приведенным ниже решением.