Используя stringstream и getline, чтобы прочитать первые два числа каждой строки

Что мне нужно сделать: у меня есть вектор линий прямо сейчас, v[0] это первая строка и так далее. Я хотел бы прочитать первое число в каждой строке как вызов и второе число в каждой строке в качестве судьи, а затем применить условия в коде. Я хочу использовать stringstream читать извлекать числа из строк.

Что мой код делает сейчас: он читает только первое число из каждой строки. Таким образом, первое число в первой строке - это вызов, а первое число во второй строке - это судья, а первое число в третьей строке - это вызов.

    std::vector<string> v;
    string line;
    int i;
    double challenge;
    int judge;

    while (getline(cin, line)) {
        if (line.empty()) {
            break;
        }

        v.push_back(line);
    }

    for (i = 0; i < v.size();i++ ) {
        cin >> v[i];
        std::stringstream ss(v[i]);
        ss << v[i];
        ss >> challenge >> judge;

        if (challenge < 1 || challenge > 5) {
            cout << "bad_difficulty" << endl; //must add the condition or empty
            v.erase(v.begin() + i);
        }

        if (judge != 5 || judge != 7 ) {
            cout << "bad_judges" << endl; //must add the condition or empty
            v.erase(v.begin() + i);
        }

        cout << v[i] << endl;

    }

    return 0;
}

Например:

Input:
 5.1 7 5.4 3.0 9.6 2.9 2.8 2.0 5.4
-3.8 7 2.9 1.1 5.7 7.2 4.8 8.5 3.9
 2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1
 2.4 6 9.2 5.2 1.0 2.9 4.9 7.4 7.9
 2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3
 3.8 5
 2.0
 4.0 7 2.4 1.9 3.2 8.3 14.8 0.1 9.7
 2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3
 1.6 -1 9.5 2.5 5.8 7.9 5.5 1.6 7.9

Output should be:
bad_difficulty
bad_difficulty
2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1
bad_judges
2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3
3.8 5
bad_judges
4.0 7 2.4 1.9 3.2 8.3 14.8 0.1 9.7
2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3
bad_judges

Current Output:
bad_difficulty
bad_judges
2.2 5 9.4 4.7 7.3 1.9 5.7 6.0 7.1
bad_judges
2.1 7 7.9 4.9 0.0 7.2 9.1 7.8 6.7 4.3
bad_judges
2.0
bad_judges
2.5 7 8.4 -8.0 5.0 6.0 8.0 1.3 3.3
bad_judges
1.6 -1 9.5 2.5 5.8 7.9 5.5 1.6 7.9

1 ответ

Решение

Давайте пройдемся по циклу удаления.

i = 0
v[0] contains line 1. 
Line 1 is 5.1 7
challenge > 5, remove 0. The vector shifts up by 1 v[0] now contains line 2
Judge == 7 do not remove 0
increment i

i = 1
v[1] contains line 3. Line 2 has been skipped
Line 3 is 2.2 5
challenge < 5, do not remove 1. 
Judge is not 5 or 7. remove 1. The vector shifts up by 1 v[1] now contains line 4
increment i

i = 2
v[2] contains line 5. Line 4 has been skipped
Line 5 is 2.1 7
challenge < 5, do not remove 2. 
Judge is 7. do not remove 2. 
increment i

i = 3
v[3] contains line 6. 
Line 6 is 3.8 5
challenge < 5, do not remove 3. 
Judge is 5. do not remove 3. 
increment i

i = 3
v[3] contains line 7. 
Line 7 is  2.0
challenge < 5, do not remove 3. 
Judge is UNDEFINED! PANIC! PANIC! Crom only knows what happens.
increment i

Во всяком случае, основной шаблон здесь должен быть ясным. Когда вы удаляете элемент из vector, все последующие элементы сдвинуты вверх. Решение: при удалении элемента не увеличивайте i, elseЗаявление позаботится об этом за вас.

Далее, потому что есть два отдельных if Заявления есть вероятность того, что оба условия будут верны и v[i] будут удалены дважды. Есть множество способов обойти это. Решение Мантана Тилвы с continue прост и эффективен, но это можно сделать более очевидно с else if или сворачивая оба теста в один и тот же if,

В-третьих, использование значений, которые не были прочитаны из потока, не определено. и не должен использоваться. Откажитесь от линии, не глядя дальше. if (ss >> challenge >> judge) поможет здесь.

Другие вопросы по тегам