来自 getline return 的 istringstream 为行中的最后一个元素加倍

istringstream from getline return double for last element in line

我有一个文件,其中包含一些由空格分隔的字符:

# 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);
}

问题是在这个配置中我总是 return 最后一个元素两次:

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”

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

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

改写while(iss >> a)