C++ 读取文件C++;

C++ 读取文件C++;,c++,C++,我需要阅读这个txt文件,但我不明白我做错了什么? 这是我的阅读功能 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.

我需要阅读这个txt文件,但我不明白我做错了什么? 这是我的阅读功能

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();
}
无效读取(学校和新南威尔士州){
字符串学校、名称、组;
学生证;
iffd(CD);
getline(fd,学校,;);
S.SetSchool(学校);
cout-ws;
getline(fd,组“”);
int-Paz[Student::M];
int kiek=0;
而(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 M=5;
私人:
字符串学校、名称、组;
int*Marks;//学生分数的动态数组
int nmax;//数组的最大大小
int n;//数组的当前大小
无效增加能力(int kiek);
公众:
学生(int-nmax=0);
~Student();
无效设置标记(int标记);
void SetSchool(弦乐学校);
void SetName(字符串名);
void集合组(字符串组);
int GetMark(int i){返回标记[i];}
字符串GetSchool(){return school;}
字符串GetName(){return name;}
字符串GetGroup(){return group;}
int GetN(){return n;}
};
学生::学生(int nmax):标记(NULL)、n(n)、nmax(nmax){
如果(nmax>0){
标记=新整数[nmax];
}
}
学生::~Student(){
如果(标记){
删除[]个标记;
Marks=NULL;
}
}
void Student::IncreaseCapasity(int kiek){//这个函数可能不正确?
if(kiek>nmax){//if数组递增
int*SNew=新的int[kiek];
for(int i=0;iname=name;
}
void Student::SetGroup(字符串组){
该->组=组;
}
当我读取int值fd>>Paz[kiek++]时,我得到了这个错误 控制台应用程序1.exe中0x571121F8(msvcp110d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0x0000000D。

getline(fd, school, ';');
fd
流读取,在第一次出现
';
时停止。由于文件中没有
';
,它将整个文件读取到
字符串中

实际上,您要做的是逐行解析文件,使用每一行构造
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;
    }

}

不安全,只需直接使用其返回值。

如果遵循“正常”编码约定我们都会发现阅读代码要容易得多。使用描述性变量名,并以小写字母开头。例如,
student
而不是
S
。另外:什么是
CD
?首先,您正在检查IO操作的零次成功或失败。您使用
;”
的分隔符参数。文件中没有
字符,因此第一个
getline
将其视为一个大行并读取所有内容。没有任何内容可供后续
getline
使用。谢谢!现在开始工作:)我刚刚编辑了我的代码。我不明白为什么会出现访问冲突读取位置错误。我认为随着我的函数增加,Capasity有问题(但我不确定)。我检查了所有代码,但仍然不明白为什么会出现这个愚蠢的错误?
while (!fd.eof()) {
    std::getline(...);
    // relying on getline call being successful here
}