错误向量下标超出范围

Posted

技术标签:

【中文标题】错误向量下标超出范围【英文标题】:Error Vector subscript out of range 【发布时间】:2015-08-02 01:09:53 【问题描述】:

当我尝试使用while 循环将向量的内容写入新文件时,我相信我的错误在我的writeline 函数中。

//Read from txt file, write to new text file

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

void readline();
void sortline(vector<string>& sortthis);
void writeline(vector<string>& list);

int main()

    readline();
    system("pause");
    return 0;
;

void readline()

    string line;
    vector<string> lines;
    ifstream myfile("classes.txt");
    if (myfile.is_open())
    
        while (myfile.good())
        
            getline(myfile, line);
            lines.push_back(line);
        ;
        myfile.close();
    
    cout << "readline() has run" << endl;
    sortline(lines);
    writeline(lines);
;

void  sortline(vector<string>& sortthis)

    sort(sortthis.begin(), sortthis.end());
;

void  writeline(vector<string>& list)

    ofstream myfile2("new.txt");
    if (myfile2.is_open())
    
        int i = 0;
        while(i !=list.size()-1)
        
            myfile2 << list[i] << endl;
            i++;
        ;
        myfile2.close();
    ;
     cout << "writeline() has run" << endl;
;

这是一个学期前的项目,我正在重新审视。我在我的 Mac 上编写了该程序,现在我正试图在我的带有 Visual Studio 的 Windows Comp 上运行它。我将描述我正在尝试做的事情,如果我提前选择的措辞很糟糕,我深表歉意。任何我放 * 的地方都是我不确定发生了什么的地方,但我会尝试一下。非常感谢对我的代码的任何解释!

我的 readline() 函数执行以下操作:创建一个名为 line 的字符串,创建一个名为 lines 的字符串类型的向量,**输入文件 classes.txt 并建立 myfile 作为它的对象,然后打开 myfile 进行写入,**使用 while 循环将 txt 中的行写入 myfile 对象,然后关闭 myfile,打印出一条语句让用户知道 readline() 已运行,然后将调用的向量传递给 sortline 函数,然后将行传递给 writeline 函数。

** sortline 接受一个字符串向量作为它的 arg,并为其分配对象 sortthis??然后我不确定会发生什么,但看起来我应用了排序算法,有人有什么想法吗?

最后我们得到了我的 writeline 函数,它接受一个字符串向量作为它的 arg 并为它们分配名称行(对吗?)然后我想为一个名为“new”的新文本文件建立一个新的输出文件流.txt" 对象名称为 myfile2,如果 myfile2 已打开,那么我想将字符串向量中的所有行(包含原始文本文件的内容)写入 myfile2,这会将它们写入 new.txt文件,然后关闭 myfile2,打印一条消息,说明该函数已运行,仅此而已。

【问题讨论】:

为什么你的函数体大括号用分号结束? 提供您的输入、输出(包括准确的错误消息)和预期输出。阅读this。 你的writeline 函数有一个名字很糟糕的参数:list。这很糟糕,因为“列表”这个词可能会与 std::list 发生冲突,而且因为它不是列表,而是向量。并且名称应该描述内容,而不是容器,所以“行”是一个更好的名称,保留它。也就是说,如果你的向量包含 3 个元素,当你调用 list.size() 时它将返回 3。因此循环退出条件应该是 i !=list.size(),而不是 i !=list.size()-1。除此之外,您应该按照 philipxy 的说明向我们提供更多详细信息。 有没有可能是空文件? 您的问题是什么? “我被卡住了”不是问题。 【参考方案1】:

writeline 中循环通过list 的方式并不安全。您应该使用for 循环或while 循环和iterator。实际上,即使list 中有多个元素,您的代码也可能不会按照您的意愿执行。考虑以下几点:

std::vector<std::string> vLines;
vLines.push_back("Hello");
vLines.push_back("File");
vLines.push_back("World");
std::ofstream of("file.txt");
int i = 0;
while (i != vLines.size() - 1)

    of << vLines[i] << std::endl;
    ++i;

即使vLines 中有多个元素,这实际上只会将 2 个元素输出到ofi 将是0,而不是2,因此将输出"Hello"of.i 将是1 不是2,所以"File" 将输出到of.i 现在是2,它是相等的到2,所以"World"不会输出到of

那是 元素。如果vLines 中有0 元素,则您的索引将超出范围(我怀疑这是您正在做的事情,因此您的错误):

std::vector<std::string> vLines;
std::ofstream of("file.txt");
int i = 0;
while (i != vLines.size() - 1)

    of << vLines[i] << std::endl;
    ++i;

i将是0,不等于-1,所以代码会运行并尝试将vLines[0]输出到of,但是没有vLines[0]!我怀疑这就是你正在经历的。

如果您改用适当的基于范围的循环,这将消失(感谢 @WhozCraig 提供 C++11 解决方案):

for (auto const& s : vLines)
    of << s;

或者,如果您没有 C++11,您仍然可以使用以下方法模拟适当的基于范围的循环:

for (int i = 0; i < vLines.size(); ++i)
    of << vLines[i] << std::endl;

或者iterator

for (auto it = vLines.begin(); it != vLines.end(); ++it)
    of << *it << std::endl;

您现在将把std::vector 中的所有元素输出到std::ofstream,并正确处理没有元素的情况。

【讨论】:

您遗漏了明显的:for (auto const&amp; s : vLines),适用于任何拥有远程最新编译器的人。 感谢 Tas,我用

以上是关于错误向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

向量下标超出范围,错误仅在调试模式下显示

c++和opencv中的向量下标超出范围错误

调试断言失败,向量下标超出范围

opencv图像处理,向量下标超出范围

向量下标超出范围错误 - C++ Vectors & Open CV

调试断言失败(向量下标超出范围)