错误矢量下标超出范围

时间:2015-08-02 01:09:53

标签: c++ vector while-loop readfile writefile

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

//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()已运行,然后**将名为lines的向量传递给sortline函数,然后将行传递到writeline函数。

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

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

1 个答案:

答案 0 :(得分:0)

您在list中循环writeline的方式并不安全。您应该使用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

元素。如果0中有vLines个元素,那么您将进行索引越界(我怀疑您正在做什么,因此您的错误):

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

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

如果您使用适当的基于范围的循环,这将消失(感谢@WhozCraig for 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,并正确处理没有元素的情况。