簡體   English   中英

C ++如何從ifstream和getline()獲取子字符串

[英]C++ How to get substring from ifstream and 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; 將子字符串打印到控制台中,但它只讀取文件並打印其中的任何內容,而不打印其他任何內容。

我相信getline只會將文件中的數據存儲到for循環中文件每一行的字符串行中,直到到達null為止。

因此,在for循環行之后本質上為null。

您需要一種替代的方式來讀取文件,或者需要一種存儲數據的方式,以便在for循環范圍(也許是字符串數組)之外使用。

希望有幫助:)

問題是您先讀取文件的所有行,然后僅解析最后讀取的行,要求起始索引超出范圍。

您需要將解析移入閱讀循環內:

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

或者,如果您知道第一行,則總是ALWAYS 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...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM