调试断言失败的向量下标超出范围C ++

时间:2017-02-19 21:47:51

标签: c++ vector ifstream

我正在使用VS2015 C ++。我尝试使用while循环读取文件并逐行输入到矢量中。

我收到此错误:

  

Debug Assertion失败!

     

程序:C:\ Windows \ SYSTEM32 \ MSVCP140D.dll

     

文件:c:\ program files(x86)\ microsoft visual studio 14.0 \ vc \ include \ vector

     

行:1234

     

表达式:向量下标超出范围

     

有关程序如何导致断言失败的信息,请参阅有关断言的Visual C ++文档。

我的代码如下:

int main() {
std::ifstream inf("walmart2.txt");

std::vector<std::string> blah;
int j = 0;

if (!inf) {
    std::cerr<< "Uh oh, walmart2.txt could not be opened for reading!" << std::endl;
    exit(1);
}
while (inf)
{
    std::string strInput;
    inf >> strInput;
    blah[j] = strInput;
    j = j + 1;
}

std::cout << blah.size() << '\n';

return 0;
}

文件“walmart2.txt”大约是1800行,格式如下:

53.74
54.09
53.5
53.72
53.43

我不完全确定最新情况。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

您正在使用索引blah[j] = strInput;访问向量,但向量的大小为零。

您可以使用

实现目标
 blah.push_back(strInput);

如果你知道他开始的大小,那么你可以做这样的事情。

std::vector<std::string> blah(n); // Vector of size n will be declared
blah[j] = strInput; // 0 <= j < n

答案 1 :(得分:0)

blah[j] = strInput;

这是未定义的行为,因为blah为空。这意味着编译器可以使程序做任何事情。

使用正确的设置进行编译时,Visual C ++会利用C ++标准中的未定义行为来实际检测错误并向您显示此错误消息。

使用push_back代替修复错误:

blah.push_back(strInput);

答案 2 :(得分:0)

使用push_back代替operator []在您的向量中添加值:vec.push_back(input);