来自getline的istringstream为行中的最后一个元素返回double

时间:2017-04-05 20:53:31

标签: c++ file inputstream

我有一个文件,其中有多个字符用空格分隔:

# cat file.txt
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

我试图将它们用于构造,例如vector,使用ifstream和istringstream,然后按照以下方式:

string line;
ifstream file("file.txt");
vector<char> row

while(getline(file, line)){
    char a; 
    istringstream iss(line);
    vector<char> row;
    while(iss){
        iss >> a;
        row.push_back(a);
    }
    table.pushback(row);
}

问题是在这个配置中,iss总是返回两次最后一个元素:

for(int i=0; i<table.size(); i++) {
    for(int j=0; j<table[i].size(); j++){
        cout << table[i][j] << " ";
    }
    cout <<endl;
}

. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. 

我认为该问题可能是由行尾字符引起的,并且由于某些原因,存储了最后一个字符。

当我读数字行“1 2 3 4 5 6 7”时 程序将打印“1 2 3 4 5 6 7 7”

为什么这种处理文件的方式有点错误?或者也许我在这个例子中遗漏了一些微不足道的东西。

1 个答案:

答案 0 :(得分:3)

语句while(iss)调用bool上的istringstream - 运算符,表示先前读取中是否发生了故障。 因此,当最后一次读取成功时,再次输入循环(因为到目前为止没有发生故障);然后,iss >> a的下一次读取将失败,但由于您忽略了操作iss >> a的返回值,a的(未更改的)值将再次被推送到您的向量。

改为写while(iss >> a)