需要帮助矢量超出范围错误

时间:2011-02-25 00:35:27

标签: c++

伙计们,我正在从一个文件中读取并输入到一个向量中,但我不断得到一个弹出框:“矢量员工超出范围!”错误。这就像我试图访问传递向量中的最后一个索引,但如果是这样的话我没有看到......任何帮助表示赞赏 文本文件:

123 vazquez 60000
222 james 100000
333 jons 50000
444 page 40000
555 plant 40000

代码:

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

struct employees { int id; string lname; double salary; };
void getData(vector<employees>& list, ifstream& inf);
int i = 0;
int main()
{
    string filename("file2.txt");
    vector<employees> list;
    ifstream inf;
    inf.open(filename);

    getData(list, inf);
    inf.close();

    for(unsigned int j = 0; j < list.size(); j++)
    {
        cout << list[j].id << " " << list[i].lname << endl;
    }

    system("pause");
    return 0;
}

void getData(vector<employees>& list, ifstream& inf)
{
    int i = 0;
    while(inf)
    {
        inf >> list[i].id >> list[i].lname >> list[i].salary;
        i++;
    }
}

3 个答案:

答案 0 :(得分:2)

当您将list传递给getData()时,其中包含零个元素。然后尝试访问索引i的元素(从0开始),但没有这样的元素,因此出错。

您需要在容器中插入新元素;最简单的方法是创建一个临时对象,将数据读入该对象,然后将该对象插入容器中。

employee e;
while (inf >> e.id >> e.lname >> e.salary)
    list.push_back(e);

请注意,这也可以修复错误的输入循环。在您的错误循环中,流可能会在循环中的一次读取期间达到EOF或以其他方式失败,但在您递增i之后才会检测到。

答案 1 :(得分:2)

getData的while循环中,每次都需要push_back employees。或者,您可以为>> operator课程定义employees,甚至不需要getData功能,只需istream_iterator vector进入istream_iterator构造函数。

使用#include <iostream> #include <vector> #include <string> #include <iterator> struct employee { int id; std::string lname; double salary; }; std::istream& operator>>(std::istream& is, employee& e) { return is >> e.id >> e.lname >> e.salary; } int main() { std::string filename("file2.txt"); std::ifstream inf; inf.open(filename); //add error checking here std::vector<employee> list((std::istream_iterator<employee>(inf)), std::istream_iterator<employee>()); for (std::vector<employee>::iterator iter = list.begin(); iter != list.end(); ++iter) { std::cout << iter->id << " " << iter->lname << std::endl; } return 0; } 的示例:

{{1}}

答案 2 :(得分:0)

list[i].lname应为list[j].lname