来自 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)
。
我有一个文件,其中包含一些由空格分隔的字符:
# 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)
。