C ++ Как получить подстроку из ifstream и getline () - PullRequest
0 голосов
/ 08 января 2019

Что выводится на консоль:

START(0,0)
GOAL(0,2)
ooox
xxoo
ooox

Я хочу иметь возможность получить подстроку точек START и GOAL, не считая скобок только пару координат. Я также хотел бы сохранить их как переменные, поскольку я хочу добавить проверку того, находятся ли точки START или GOAL вне границ сетки.

Я пытаюсь создать приложение для обхода 2D-сетки, где «x» представляет заблокированные пути, а «o» - разблокированные.

Отправной точкой всегда является нижний левый угол сетки, как показано ниже:

(0,2)(1,2)(2,2)(3,2)
(0,1)(1,1)(2,1)(3,1)
(0,0)(1,0)(2,0)(3,0)

Я пытался использовать метод .substr () с начальной и конечной точками, где я хотел бы сохранить значения, но он ничего не выводит в консоль.

void Grid::loadFromFile(const std::string& filename){
    std::string line;
    std::ifstream file(filename);
    file.open(filename);
    // Reads the file line by line and outputs each line
    while(std::getline(file, line)) {
        std::cout << line << std::endl;
    }

        std::string startPoint, goalPoint;

        startPoint = line.substr(6,3);
        std::cout << startPoint << std::endl;

        file.close();
    }

Я ожидаю, что std::cout << startPoint << std::endl; напечатает подстроку в консоли, но она просто читает файл и печатает все, что в нем, и ничего больше.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Проблема в том, что вы сначала читаете ВСЕ строки файла, ТОГДА вы анализируете только последнюю прочитанную строку, запрашивая начальный индекс, выходящий за пределы диапазона.

Вам нужно вместо этого перевести анализ в цикл чтения:

void Grid::loadFromFile(const std::string& filename)
{
    std::ifstream file(filename);
    if (!file.is_open()) return;

    std::string line, startPoint, goalPoint;
    std::vector<std::string> grid;

    while (std::getline(file, line))
    {
        if (line.compare(0, 5, "START") == 0)
            startPoint = line.substr(6,3);
        else if (line.compare(0, 4, "GOAL") == 0)
            goalPoint = line.substr(5,3);
        else
            grid.push_back(line);
    }

    file.close();

    std::cout << startPoint << std::endl;
    std::cout << goalPoint << std::endl;

    // process grid as needed...
}

Или, если вы знаете, что первые две строки ВСЕГДА START и GOAL:

void Grid::loadFromFile(const std::string& filename)
{
    std::ifstream file(filename);
    if (!file.is_open()) return;

    std::string line, startPoint, goalPoint;
    std::vector<std::string> grid;

    if (!std::getline(file, line)) return;
    if (line.compare(0, 5, "START") != 0) return;
    startPoint = line.substr(6,3);

    if (!std::getline(file, line)) return;
    if (line.compare(0, 4, "GOAL") != 0) return;
    goalPoint = line.substr(5,3);

    while (std::getline(file, line))
        grid.push_back(line);

    file.close();

    std::cout << startPoint << std::endl;
    std::cout << goalPoint << std::endl;

    // process grid as needed...
}
0 голосов
/ 08 января 2019

Я считаю, что getline хранит данные из файла в строковую строку для каждой строки файла в цикле for, пока не достигнет нуля.

Таким образом, после строки цикла for = практически ноль.

Вам нужен либо альтернативный способ чтения файла, либо способ хранения данных для использования вне области цикла for (возможно, строковый массив).

Надеюсь, это поможет :)

...