将文件读取到向量的向量,超出范围错误

Read file to vector of vectors, out of range error

本文关键字:向量 范围 错误 文件 读取      更新时间:2023-10-16

我正在研究一个为项目解决迷宫的程序。要求是迷宫文本文件能够以任何方式变化,并且必须将其读取到字符的向量。

的向量。

到目前为止,我创建了一个程序,至少应该在我脑海中起作用,在文件中的每一行中为矢量增加了一个循环。而且,我使用文件当前行上的.at((运算符使用一个简单的循环。在底部,我可以简单地显示循环显示第一行。问题在于我一直在向向量出现范围错误。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

int main(){
    ifstream file;
    string fileName;
    string Line;
    vector<vector<char>> Maze;
    cout << "Enter the maze file name and extension: " << endl;
    cin >> fileName;
    file.open(fileName);
    while (getline(file, Line)) {
        int rowNumber = 0;
        vector<char> row;
        Maze.push_back(row);
        for (int i = 0; i < Line.size(); i++) {
            Maze[rowNumber].push_back(Line.at(i));
        }
        rowNumber++;
    }
    for (int i = 0; i < 5; i++) {
        cout << Maze[0][i];
    }
    system("pause");
    return 0;
}

我正在使用一个具有5行的5行,没有空格的测试文件。我希望该程序将打印出文件的第一行,而是我会得到一个调试断言失败的错误,并指出向量下标不超出范围。任何帮助都将受到赞赏

您的代码有几个评论。

它的工作原理。它不会产生运行时错误,但也不会产生预期的结果。

主张是,您始终在while循环开始时每次将变量rowNumber设置为0。rowNumber++;结束时无效。因此,您是Alwyas向Maze[0]添加字符。

那是您的语义错误。

当您尝试访问Maze[1][i]

时,您的运行时错误出现了

然后,使用C 算法可以大大缩短您的代码。请参阅:


#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>

std::istringstream testDataFile(
R"#(00000
11111
22222
33333
44444
)#");

// This is a proxy to read a complete line with the extractor operator
struct CompleteLineAsVectorOfChar {
    // Overloaded Extractor Operator
    friend std::istream& operator>>(std::istream& is, CompleteLineAsVectorOfChar& cl) {
        std::string s{}; cl.completeLine.clear();  std::getline(is, s); 
        std::copy(s.begin(), s.end(), std::back_inserter(cl.completeLine));
        return is; }
    operator std::vector<char>() const { return completeLine; }  // Type cast operator for expected value
    std::vector<char> completeLine{};
};

int main()
{
    // Read complete source file into maze, by simply defining the variable and using the range constructor
    std::vector<std::vector<char>> maze { std::istream_iterator<CompleteLineAsVectorOfChar>(testDataFile), std::istream_iterator<CompleteLineAsVectorOfChar>() };
    // Debug output:  Copy all data to std::cout
    std::for_each(maze.begin(), maze.end(), [](const std::vector<char> & l) {std::copy(l.begin(), l.end(), std::ostream_iterator<char>(std::cout, " ")); std::cout << 'n'; });
    return 0;
}

,但这不是终点。std::vector<char>比字符串没有优势。您可以工作几乎具有与std::vector<char>相同的功能。这是设计的改进。然后,代码看起来更像是这样:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>
std::istringstream testDataFile(
R"#(00000
11111
22222
33333
44444
)#");
int main()
{
    // Read complete source file into maze, by simply defining the variable and using the range constructor
    std::vector<std::string> maze{ std::istream_iterator<std::string>(testDataFile), std::istream_iterator<std::string>() };
    // Debug output:  Copy all data to std::cout
    std::copy(maze.begin(), maze.end(), std::ostream_iterator<std::string>(std::cout, "n"));
    return 0;
}

这是更简单的解决方案。它也将满足您的需求。

请注意:我使用了一个iStringstream来读取数据,因为我没有文件。但这与使用任何其他流相同(例如ifstream(。

希望这会有所帮助。。。