二维向量推回中的分段错误 我学习C++,我有一个分割错误的问题。在我的项目中,我想从一个文件读入一个二维的字符向量。 向量是std::Vector 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++; } } void结构::readFile(常量std::字符串文件名) { std::ifstream文件(filename.c_str()); 如果(!file.is_open()) { std::cerr
您需要首先将第一个向量a二维向量推回中的分段错误 我学习C++,我有一个分割错误的问题。在我的项目中,我想从一个文件读入一个二维的字符向量。 向量是std::Vector 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++; } } void结构::readFile(常量std::字符串文件名) { std::ifstream文件(filename.c_str()); 如果(!file.is_open()) { std::cerr,c++,c++11,segmentation-fault,stdvector,C++,C++11,Segmentation Fault,Stdvector,您需要首先将第一个向量astd::vector推回,因为默认情况下gamearea向量为空,因此在访问gamearea[i]时,您最终访问超出范围(因为gamearea中有0个元素) void结构::readFile(常量std::字符串文件名) { std::ifstream文件(filename.c_str()); 如果(!file.is_open()){ 以下是一个正确读取和更新向量的示例,假设向量为空: void Structure::readFile(const std::strin
std::vector
推回,因为默认情况下gamearea向量为空,因此在访问gamearea[i]时,您最终访问超出范围(因为gamearea中有0个元素)
void结构::readFile(常量std::字符串文件名)
{
std::ifstream文件(filename.c_str());
如果(!file.is_open()){
以下是一个正确读取和更新向量的示例,假设向量为空:
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()));
}
void结构::readFile(常量std::字符串文件名)
{
std::ifstream文件(filename.c_str());
如果(!file.is_open()){
std::cerrgameArea[i]。push_back(第[j]行)
——将此更改为gameArea.at(i)。push_back(第[j]行)
,如果您现在得到的是一个超出\u范围的异常,而不是分段错误,请不要感到惊讶。换句话说,没有gameArea[i]
因为i
是一个无效的索引。你能给我解释一下为什么我是一个无效的索引以及我需要更改什么吗?我想把游戏区域中a的行保存在向量中,在其他函数中,我需要游戏中东西的确切位置,比如图形和方框。我想我可以用i with row is和line[j]来表示将字符保存在向量中,以便我知道字符的行和列。好的,谢谢,我知道不再存在分割错误,但它不会在向量中保存任何内容。我是否忘记了将文件内容保存在该向量中的内容?哪个向量没有保存?你确定j会增加吗?我想是的。但我在在std::vector curArea之后发生的调试器;类似这样的事情发生在305 std::vector curArea;(gdb)step std::vector::vector(this=0x7fffffffe1a0)at/usr/include/c++/4.9/bits/stl_vector.h:257257:_Base(){}(gdb)step std:_vector_Base:_vector_Base:_vector_Base(this=0x7fffffe1a0)在/usr/include/c++/4.9/bits/stl_vector.h:125:_M_impl(){}
中,我不确定这告诉了我什么,因为它没有进入for循环。好吧,我认为它可以工作,但我在show()时没有得到控制台上的区域函数在主调试器中调用,当我进入调试器时,类似这样的内容:std::vector::vector(this=0x7fffffe1c0,u first=35'#',u last=0'\000',u a=…)在/usr/include/c++/4.9/bits/stl_vector.h:403:_Base(u a)
即将发生,我不知道这里发生了什么。我不太习惯理解调试器。请看我的示例,输入被读入并正确分配到游戏区域2d向量。
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()));
}