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++;
}
}
答案 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