C ++如何从ifstream和getline()获取子字符串

时间:2019-01-08 20:12:20

标签: c++ c++11 substring getline

控制台显示的内容:

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 :(得分:1)

问题是您先读取文件的所有行,然后仅解析已读取的最后一行,要求起始索引超出范围。

您需要将解析移入阅读循环内:

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...
}

或者,如果您知道前两行总是STARTGOAL

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...
}

答案 1 :(得分:0)

我相信getline只会将文件中的数据存储到for循环中文件每一行的字符串行中,直到到达null为止。

因此,在for循环行之后,基本上= null。

您需要读取文件的另一种方法或存储数据的方法,以便在for循环范围(也许是字符串数组)之外使用。

希望有帮助:)