错误:为什么这个getline只循环一次?

时间:2017-01-25 05:16:08

标签: c++

while(getline(data, word, '\n')){//seperates by line
    ss<<word; // output1: Chicken, for sale, 60
              // output2: Microwave, wanted, 100 (and so on)

    while(getline(ss, word, ',')){//seperates by individual words + space
        // output1: Chicken
        // output2: for sale
        // output3: 60
        if(word[0]==' '){ //removes space in 2 and 3
            word.erase(0,1);
        }

        if(wordindex==0){
            board[i].object=word;
            wordindex++;
        }
        else if(wordindex==1){
            board[i].type=word;
            wordindex++;
        }
        else if(wordindex==2){
            board[i].price=word;
            wordindex=0; //resets index to 0 for next line
            i++; //moves to next struct in array
        }
    }
}

第二个getline循环仅为第一个输入循环一次:chicken, for sale, and 60并且没有到达第二个。我认为单词索引始终设置为0所以它应该不是问题。此外,第一个getline()完全输出所有数据,因此导致第二个getline()混淆。我只是看不出它是什么。

1 个答案:

答案 0 :(得分:3)

下面

ss<<word;

OP重用一个字符串流,该字符串流可能在前一次迭代中被读取到末尾,将该流设置为不能再写入或读取的错误状态。这可以通过添加

来解决
ss.clear();

在循环结束时删除任何坏标志,但是通过不断地将mor数据写入字符串流,它将继续增长,吸收越来越多的内存,除非用“

”之类的东西清空
ss.str(std::string());

将其内部缓冲区设置回空字符串。如果构造和破坏对解析速度的增加成本不是问题,那么仅为了代码清晰度而创建新的stringstream每次迭代可能更好。

以下是内部解析循环的一种更简单的方法:

std::stringstream ss(word);
while(i<MAX_ARRAY_SIZE && // prevent overflow
      getline(ss,  board[i].object, ',') && 
      getline(ss, board[i].type, ',') && 
      getline(ss, board[i].price, ',')){ // read all three parameters directly into object
    //sanitize
    if(board[i].type[0]==' '){ 
        board[i].type.erase(0,1);
    }

    if(board[i].price[0]==' '){ 
        board[i].price.erase(0,1);
    }
    i++; // next, please
}