为什么getline()不能在我的代码(c ++)中工作?

时间:2016-03-08 00:22:18

标签: c++

我和其他成员一起上课“消息”:

protected:
      int * next;
      int amount;
      std::string ** mes;
public:
      message(std::ifstream*);

,构造函数的代码是:

message :: message(ifstream * myfile){
    *myfile >> amount;
    if (amount==0){
                next = new int[1];
                *myfile >> next[0];
                mes = new string*[1];
                getline(*myfile,*mes[0]);
                }
    else{
                next = new int[amount];
                mes = new string*[amount];
                for (int i=0;i<amount;i++){
                    *myfile >> next[i];
                    getline(*myfile,*mes[i]);
                    }
                }
    }

使用运算符&gt;&gt;从文件读取工作正常,但程序在getline()崩溃 - 为什么?我应该改变什么?

1 个答案:

答案 0 :(得分:2)

您没有为要求std::string读取的std::getline()变量分配任何内存。您正在分配不指向任何内容的string*指针数组。您需要将代码更改为:

  1. 继续使用指针数组,但为它们分配实际的string变量:

    std::string ** mes;
    

    if (amount == 0) {
        ...
        mes = new string*[1];
        mes[0] = new string; // <-- here
        std::getline(*myfile, *mes[0]);
    }
    else {
        ...
        mes = new string*[amount];
        for (int i = 0; i < amount; ++i) {
            mes = new string[amount]; // <-- here
        }
        for (int i = 0; i < amount; ++i) {
            ...
            std::getline(*myfile, *mes[i]);
        }
    }
    
  2. 删除不必要的间接级别以开始:

    std::string * mes;
    

    if (amount == 0) {
        ...
        mes = new string[1];
        std::getline(*myfile, mes[0]);
    }
    else{
        ...
        mes = new string[amount];
        for (int i = 0; i < amount; ++i) {
            ...
            std::getline(*myfile, mes[i]);
        }
    }
    
  3. Wit说,你应该停止使用原始数组,而是使用std::vector

    #include <vector>
    
    protected:
        std::vector<int> next;
        std::vector<std::string> mes;
        int amount;
    

    message :: message(ifstream * myfile) {
        *myfile >> amount;
        if (amount == 0) {
            next.resize(1);
            mes.resize(1);
            *myfile >> next[0];
            std::getline(*myfile, mes[0]);
        }
        else {
            next.resize(amount);
            mes.resize(amount);
            for (int i = 0; i < amount; ++i) {
                *myfile >> next[i];
                std::getline(*myfile, mes[i]);
            }
        }
    }
    

    无论哪种方式,您都应该考虑删除amount == 0案例的冗余代码。如果amount为0,则使用局部变量并将其设置为1,否则将其设置为实际amount,然后无论{{1}如何,您都可以使用单个代码行执行分配} value:

    amount

    message :: message(ifstream * myfile) {
        *myfile >> amount;
        int numElements = (amount == 0) ? 1 : amount;
        next = new int[numElements];
        mes = new string[numElements];
        for (int i = 0; i < numElements; ++i) {
            *myfile >> next[i];
            getline(*myfile, mes[i]);
        }
    }