将文件中的数据复制到指针向量中
Copy data from file into vector of pointers
我试图在下面创建一个名为 load() 的函数,它将所有记录从我的 graduate.dat 文件复制到我的记录指针向量中,称为 primaryCollection。我创建了一个 Record class,其中包含构成每个 Record 的变量,并且在 load()
函数中 createReport.cc
我试图读取文件中的每一行,创建一个 Record object每行,然后将其添加到我的向量中。
问题是我一直收到错误:
createReport.cc: In static member function ‘static void createReport::load()’:
createReport.cc:25:71: error: expression list treated as compound expression in initializer [-fpermissive]
Record* record(year, province, degree); //create Record object with this data
^
createReport.cc:25:71: error: invalid conversion from ‘int’ to ‘Record*’ [-fpermissive]
我不确定这是为什么,如果您能帮助我尝试读取文件,请将每条记录添加到我的 collection。
我的graduate.dat文件格式如下,格式为<年省学位>
2000 AB Bachelor's
2005 AB Bachelor's
2005 MB College
primaryCollection 必须是记录指针的向量,我也不允许在此任务中使用 std::map
。
Record.h
#ifndef RECORD_H
#define RECORD_H
#include <iostream>
#include <string>
class Record{
public:
Record(int = 0, string = "", string = "");
~Record();
private:
int year;
string province;
string degree;
};
#endif
Record.cc
#include <iostream>
#include <string>
using namespace std;
#include "Record.h"
Record::Record(int i1, string s1, string s2) : year(i1), province(s1), degree(s2){}
Record::~Record(){}
createReport.h
#ifndef CREATEREPORT_H
#define CREATEREPORT_H
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include "Record.h"
class createReport{
public:
createReport();
static void load();
protected:
static vector<Record*> primaryCollection; //STL vector of record pointers
};
#endif
createReport.cc
#include <iostream>
using namespace std;
#include <string>
#include "createReport.h"
void createReport::load(){
int year;
string province, degree;
ostream_iterator<Record*> outItr(cout);
ifstream infile("graduate.dat", ios::in);
if (!infile) {
cout << "Error: could not open file" << endl;
exit(1);
}
while (infile >> year >> province >> degree) { //as long as were not at end of file
Record* record(year, province, degree); //create Record object with this data
primaryCollection.push_back(record);
}
cout<<endl<<"List of Records:"<<endl;
copy(primaryCollection.begin(), primaryCollection.end(), outItr); //print records
}
这里正确的语法是:
Record* record = new Record(year, province, degree);
之后的一切都很好,但请记住 vector
现在“拥有”指针,您有责任以某种方式释放这些分配。这就是 pointer wrappers 派上用场的地方。
我试图在下面创建一个名为 load() 的函数,它将所有记录从我的 graduate.dat 文件复制到我的记录指针向量中,称为 primaryCollection。我创建了一个 Record class,其中包含构成每个 Record 的变量,并且在 load()
函数中 createReport.cc
我试图读取文件中的每一行,创建一个 Record object每行,然后将其添加到我的向量中。
问题是我一直收到错误:
createReport.cc: In static member function ‘static void createReport::load()’:
createReport.cc:25:71: error: expression list treated as compound expression in initializer [-fpermissive]
Record* record(year, province, degree); //create Record object with this data
^
createReport.cc:25:71: error: invalid conversion from ‘int’ to ‘Record*’ [-fpermissive]
我不确定这是为什么,如果您能帮助我尝试读取文件,请将每条记录添加到我的 collection。
我的graduate.dat文件格式如下,格式为<年省学位>
2000 AB Bachelor's
2005 AB Bachelor's
2005 MB College
primaryCollection 必须是记录指针的向量,我也不允许在此任务中使用 std::map
。
Record.h
#ifndef RECORD_H
#define RECORD_H
#include <iostream>
#include <string>
class Record{
public:
Record(int = 0, string = "", string = "");
~Record();
private:
int year;
string province;
string degree;
};
#endif
Record.cc
#include <iostream>
#include <string>
using namespace std;
#include "Record.h"
Record::Record(int i1, string s1, string s2) : year(i1), province(s1), degree(s2){}
Record::~Record(){}
createReport.h
#ifndef CREATEREPORT_H
#define CREATEREPORT_H
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include "Record.h"
class createReport{
public:
createReport();
static void load();
protected:
static vector<Record*> primaryCollection; //STL vector of record pointers
};
#endif
createReport.cc
#include <iostream>
using namespace std;
#include <string>
#include "createReport.h"
void createReport::load(){
int year;
string province, degree;
ostream_iterator<Record*> outItr(cout);
ifstream infile("graduate.dat", ios::in);
if (!infile) {
cout << "Error: could not open file" << endl;
exit(1);
}
while (infile >> year >> province >> degree) { //as long as were not at end of file
Record* record(year, province, degree); //create Record object with this data
primaryCollection.push_back(record);
}
cout<<endl<<"List of Records:"<<endl;
copy(primaryCollection.begin(), primaryCollection.end(), outItr); //print records
}
这里正确的语法是:
Record* record = new Record(year, province, degree);
之后的一切都很好,但请记住 vector
现在“拥有”指针,您有责任以某种方式释放这些分配。这就是 pointer wrappers 派上用场的地方。