错误向量下标超出范围
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 个元素输出到of
。i
将是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& s : vLines)
,适用于任何拥有远程最新编译器的人。
感谢 Tas,我用
以上是关于错误向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章