我需要阅读这个txt文件,但我不明白我做错了什么? http://pastebin.com/gPVbuvhb这是我的阅读功能
void Read(School & snew){
string school, name, group;
Student S;
ifstream fd(CD);
getline(fd, school, ';');
S.SetSchool(school);
cout << S.GetSchool() << endl;
while(!fd.eof()){
getline(fd, name, ',');
fd >> ws;
getline(fd, group, ' ');
int Paz[Student::M];
int kiek = 0;
while(fd.peek()!= '\n' && !fd.eof()){
fd >> Paz[kiek++];
}
fd.ignore();
}
fd.close();
}
这是我的学生班
class Student{
public:
static const int M = 5;
private:
string school, name, group;
int *Marks; // dynamic array of student marks
int nmax; // max size of array
int n; // current size of array
void IncreaseCapasity(int kiek);
public:
Student(int nmax = 0);
~Student();
void SetMarks(int mark);
void SetSchool(string school);
void SetName(string name);
void SetGroup(string group);
int GetMark(int i){return Marks[i];}
string GetSchool(){return school;}
string GetName(){return name;}
string GetGroup(){return group;}
int GetN(){return n;}
};
Student::Student(int nmax):Marks(NULL), n(n), nmax(nmax){
if(nmax > 0){
Marks = new int[nmax];
}
}
Student::~Student(){
if(Marks){
delete [] Marks;
Marks = NULL;
}
}
void Student::IncreaseCapasity(int kiek){ // maybe this function is incorrect?
if(kiek > nmax){ // if array increasing
int *SNew = new int [kiek];
for(int i=0; i<n; i++)
SNew[i] = Marks[i];
delete [] Marks;
Marks = SNew;
nmax = kiek;
}if(kiek < nmax){ // if array decreasing
int *SNew = new int [kiek];
for(int i=0; i<kiek; i++)
SNew[i] = Marks[i];
delete [] Marks;
Marks = SNew;
n = nmax = kiek;
}
}
void Student::SetMarks(int mark){
if(n == nmax) IncreaseCapasity(n + M);
Marks[n] = mark;
n++;
}
void Student::SetSchool(string school){
this->school = school;
}
void Student::SetName(string name){
this->name = name;
}
void Student::SetGroup(string group){
this->group = group;
}
当我读取int值fd&gt;&gt;帕兹[++的Kiek]。我收到这个错误 ConsoleApplication1.exe中0x571121F8(msvcp110d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x0000000D。
答案 0 :(得分:1)
getline(fd, school, ';');
从fd
流中读取,在';'
首次出现时停止。由于文件中没有';'
,因此它将整个文件读入school
字符串。
您实际想要做的是逐行解析文件,使用每一行构建istringstream
的实例:
std::string line;
while (std::getline(fd, line)) {
if (line.empty())
continue;
std::istringstream is(line);
std::string name, group;
if (std::getline(is, name, ',') && std::getline(is, group, ',')) {
std::cout << "Name: " << name << " Group: " << group << std::endl;
}
}
请不要忘记#include <sstream>
。
另请注意:
while (!fd.eof()) {
std::getline(...);
// relying on getline call being successful here
}
不安全,只需直接使用其返回值。