将文件读取到向量的向量,超出范围错误
Read file to vector of vectors, out of range error
我正在研究一个为项目解决迷宫的程序。要求是迷宫文本文件能够以任何方式变化,并且必须将其读取到字符的向量。
的向量。到目前为止,我创建了一个程序,至少应该在我脑海中起作用,在文件中的每一行中为矢量增加了一个循环。而且,我使用文件当前行上的.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(。
希望这会有所帮助。。。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 布尔值向量的基于范围 for 循环
- 如何使用count_if计算向量中的可变数字范围
- 范围 v3 的和向量
- 关于在向量向量上使用基于范围的 for 循环
- 使用基于范围的指针循环和向量时出现C++错误
- 用基于范围的for循环填充指针向量
- 创建结构体向量,表达式:向量下标超出范围
- 代码超出范围.如何动态分配此向量?
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 从给定范围内的向量中查找最大元素
- 向量向量的范围范围
- 将局部变量保存到全局向量中,为什么离开局部范围后可以得到这些局部变量?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 在 c++ 中检查 if 条件中的向量位置范围
- 向量下标超出向量向量的范围
- 如何正确使用向量范围构造函数