C++ 我的程序在试图将数据集附加到类对象中时遇到“返回的进程-1073741819(0xC0000005)”

C++ 我的程序在试图将数据集附加到类对象中时遇到“返回的进程-1073741819(0xC0000005)”,c++,C++,我目前正在尝试附加一组数据,这些数据由逗号分隔,如下所示: class Customers{ public: string lastname; string firstname; string id; public: void setLN (string ln) {lastname = ln;} void setFN (string fn) {firstname = fn;} void setID (string ident) {id = iden

我目前正在尝试附加一组数据,这些数据由逗号分隔,如下所示:

class Customers{
public:
    string lastname;
    string firstname;
    string id;
public:
    void setLN (string ln) {lastname = ln;}
    void setFN (string fn) {firstname = fn;}
    void setID (string ident) {id = ident;}
};

template <class T>
class hashTable{
private:
    node<T> *harray[10], *tarray[10];
public:
    void hashBrown(){
        fstream inputFile;
        int totalNum = 0;
        int ln = 0;
        int fn = 0;
        int idn = 0;
        string line;
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                totalNum++;
                Customers obj[totalNum];
                istringstream iss(line);
                string token;
                getline(iss, token, ',');
                cout<<token<<" ";
                obj[totalNum].setLN(token);

                getline(iss, token, ',');
                cout<<token<<" ";
                obj[totalNum].setFN(token);

                getline(iss, token);
                cout<<token<<"\n";
                obj[totalNum].setID(token);

            }
            cout << totalNum;
        }
    }
};

姓,名,身份证号码

lastname2,firstname2,id-number2

等等

进入一个类对象,如下所示:

class Customers{
public:
    string lastname;
    string firstname;
    string id;
public:
    void setLN (string ln) {lastname = ln;}
    void setFN (string fn) {firstname = fn;}
    void setID (string ident) {id = ident;}
};

template <class T>
class hashTable{
private:
    node<T> *harray[10], *tarray[10];
public:
    void hashBrown(){
        fstream inputFile;
        int totalNum = 0;
        int ln = 0;
        int fn = 0;
        int idn = 0;
        string line;
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                totalNum++;
                Customers obj[totalNum];
                istringstream iss(line);
                string token;
                getline(iss, token, ',');
                cout<<token<<" ";
                obj[totalNum].setLN(token);

                getline(iss, token, ',');
                cout<<token<<" ";
                obj[totalNum].setFN(token);

                getline(iss, token);
                cout<<token<<"\n";
                obj[totalNum].setID(token);

            }
            cout << totalNum;
        }
    }
};

这三行,但我不怀疑这是问题所在,因为当我添加

cout<<obj[totalNum].lastname;

cout<<obj[totalNum].firstname;

cout<<obj[totalNum].id;

它打印出正确的值,但随后立即崩溃。我已经讨论了一个小时,我知道我遗漏了一些东西,但我不能确切地找出在哪里和什么地方。

程序中有几个问题看起来可疑。 例如,您正在循环体中创建类型为array of Customer的局部变量;它将在循环的每次迭代中一次又一次地初始化,一旦循环完成,它将变得无效/超出范围

无论如何,以下语句将产生未定义的行为:

 Customers obj[totalNum];
 ...
 obj[totalNum].setLN(token);
这是因为,不管totalNum的值是什么,您都将访问数组大小后面的元素1。请注意,当您创建一个大小为10的数组时,有效标识的范围是[0..9]而不是[1..10]

要克服这个问题,你可以写

 Customers obj[totalNum+1];
 ...
 obj[totalNum].setLN(token);

但是,正如一开始提到的,还有其他事情需要考虑

顺便说一句:客户对象[totalNum];定义了一个可变长度数组,虽然有些编译器支持它,但它并不被标准C++支持。

P>谢谢大家!p>
template <class T>
class hashTable{
private:
    node<T> *harray[10], *tarray[10];
public:
    void hashBrown(){
        fstream inputFile;
        int totalNum = 0;
        int currentNum = 0;
        int fn = 0;
        int idn = 0;
        string line;
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                totalNum++;
            }
        }
        inputFile.close();
        Customers obj[totalNum];
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                istringstream iss(line);
                string token;
                getline(iss, token, ',');
                cout<<token;
                obj[currentNum].setLN(token);
                cout<<obj[currentNum].lastname;

                getline(iss, token, ',');
                obj[currentNum].setFN(token);
                cout<<obj[currentNum].firstname;

                getline(iss, token, ',');
                obj[currentNum].setID(token);
                cout<<obj[currentNum].id<<"\n";

                currentNum++;

            }
        }
    }
};
可能效率很低,但它解决了问题

Customers obj[totalNum];数组的索引范围为0到totalNum-1
template <class T>
class hashTable{
private:
    node<T> *harray[10], *tarray[10];
public:
    void hashBrown(){
        fstream inputFile;
        int totalNum = 0;
        int currentNum = 0;
        int fn = 0;
        int idn = 0;
        string line;
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                totalNum++;
            }
        }
        inputFile.close();
        Customers obj[totalNum];
        inputFile.open("Customer.csv", ios::in|ios::binary);
        if(inputFile.is_open()){
            while(getline(inputFile, line)){
                istringstream iss(line);
                string token;
                getline(iss, token, ',');
                cout<<token;
                obj[currentNum].setLN(token);
                cout<<obj[currentNum].lastname;

                getline(iss, token, ',');
                obj[currentNum].setFN(token);
                cout<<obj[currentNum].firstname;

                getline(iss, token, ',');
                obj[currentNum].setID(token);
                cout<<obj[currentNum].id<<"\n";

                currentNum++;

            }
        }
    }
};