我有一个文件,其中有多个字符用空格分隔:
# 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”
为什么这种处理文件的方式有点错误?或者也许我在这个例子中遗漏了一些微不足道的东西。
答案 0 :(得分:3)
语句while(iss)
调用bool
上的istringstream
- 运算符,表示先前读取中是否发生了故障。
因此,当最后一次读取成功时,再次输入循环(因为到目前为止没有发生故障);然后,iss >> a
的下一次读取将失败,但由于您忽略了操作iss >> a
的返回值,a
的(未更改的)值将再次被推送到您的向量。
改为写while(iss >> a)
。