我正在尝试读取文本文件中的行,对行进行标记,然后继续对切换中的下一行执行相同操作并打破块,但是在我的程序到达第一个中断后,它退出循环并且忽略文件的其余部分。
ifstream in("test.txt");
string line,buffer;
unsigned int firstLetter = 0;
//istringstream iss;
if( in.is_open() )
{
istringstream iss;
while(getline(in,line))
{
iss.str(line);
char firstChar = line.at( firstLetter );
switch ( firstChar )
{
case 'D':
while (getline(iss,buffer,'-'))
{//print each token, one per line
cout<<"buffer: "<<buffer<<" "<<endl;
}
break;
case 'R':
while ( getline(iss,buffer,'-') )
{cout<<"buffer: "<<buffer<<" "<<endl;}
break;
}
}
}
这是文本文件的内容:
D-Rise of the Titans-25.50-2009-12
D-23 Jump Street-20.00-2013-5
D-Home Alone-24.00-1995-16
D-Twin Warriors-24.00-2011-14
R-XXX-Pierce-Hawthorne-11-13
R-Forbidden Kingdom-Pierce-Hawthorne-13-31
R-23 Jump Street-Troy-Barnes-1-3
R-Home Alone-Shirley-Bennett-1-3
R-Modern Family-Abed-Nadir-10-66
但是当我运行我的代码时,我得到了这个:
buffer: D
buffer: Rise of the Titans
buffer: 25.50
buffer: 2009
buffer: 12
这是文本文件中第1行的内容,如何进入下一行并继续这样做直到文件结尾?
答案 0 :(得分:1)
问题是你遍历istringstream的内容直到它失败。然后,在其余行中重用相同的istringstream。您需要清除其中的fail / eof位。
使用iss.clear()执行此操作。
#include <iostream>
#include <sstream>
#include <fstream>
int main(){
ifstream in('test.txt');
if (in.is_open()){
string line, buffer;
istringstream iss;
while (getline(in, line)){
iss.str(line);
iss.clear();
char c = line[0];
switch (c){
case 'D':
while (getline(iss, buffer, '-')){
cout << "buffer: " << buffer << endl;
}
break;
case 'R':
while (getline(iss, buffer, '-')){
cout << "buffer: " << buffer << endl;
}
break;
}
}
return 0;
}