我正在开发一个解决项目迷宫的程序。要求迷宫文本文件的长度能够以任何方式变化,并且必须将其读取为字符向量的向量。
到目前为止,我已经创建了一个程序,至少应该在我的脑海中起作用,有一个while循环为文件中的每一行添加了一行到矢量。我正在文件的当前行上使用.at()运算符使用带有推回的简单for循环。在底部,我有一个简单的for循环以显示第一行。问题是我的向量总是超出范围。
#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个字符,没有空格。我希望程序会打印出文件的第一行,相反,我会收到“调试声明失败”错误,并指出矢量下标超出范围。感谢您的帮助
答案 0 :(得分:0)
您的代码有几个注释。
它按照显示的方式工作。它不会产生运行时错误,但也不会产生预期的结果。
问题是您总是在while循环开始时始终将变量rowNumber
设置为0。 rowNumber++;
结束时将无效。因此,您一直在向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;
}
这是更简单的解决方案。它将同样满足您的需求。
请注意:因为我在SO上没有文件,所以我使用istringstream读取数据。但这与使用其他任何流(例如ifstream)的原因相同。
希望这会有所帮助。 。