我正在学习c ++,我遇到了分段错误的问题。在我的项目中,我想从一个文件读入一个2d的char矢量。
Vector是std::vector<std::vector<char>> gamearea;
void Structure::readFile(const std::string filename)
{
std::ifstream file(filename.c_str());
if (!file.is_open())
{
std::cerr << "Error opening file: " << filename << std::endl;
exit(1);
}
std::string line;
int i = 0;
while (true)
{
std::getline(file, line);
if (file.eof())
{
break;
}
for (size_t j = 0; j< line.length(); j++)
{
gamearea[i].push_back(line[j]);
}
i++;
}
}
这是我的读取文件函数,调试器(我使用gdb)表示push_back
是一个分段错误。
有人能帮助我吗?我找不到问题。
答案 0 :(得分:3)
你需要先回到第一个向量std::vector<char>
,因为默认情况下,gamearea向量是空的,所以在访问gamearea [i]时你最终访问越界(因为gamearea里面有0个元素) )
void Structure::readFile(const std::string filename)
{
std::ifstream file(filename.c_str());
if (!file.is_open()) {
std::cerr << "Error opening file: " << filename << std::endl; exit(1);
}
std::string line; int i = 0;
while (true) {
std::getline(file, line);
if (file.eof()) { break; }
// NOTICE HERE
// We add a new vector to the empty vector
std::vector<char> curArea;
gamearea.push_back(curArea);
for (size_t j = 0; j< line.length(); j++) {
gamearea[i].push_back(line[j]);
}
i++;
}
}
答案 1 :(得分:0)
这是一个正确读入和更新矢量的示例,只要它是空的:
void Structure::readFile(const std::string filename)
{
std::ifstream file(filename.c_str());
if (!file.is_open()) {
std::cerr << "Error opening file: " << filename << std::endl;
return;
std::string line;
while (std::getline(file, line))
gamearea.push_back(std::vector<char>(line.begin(), line.end()));
}
注意我们不需要测试eof()
。另外,我们需要做的就是使用带有两个迭代器的两个参数std :: vector构造函数来调用push_back
整个数据字符串。