【发布时间】:2015-07-16 01:54:15
【问题描述】:
我正在尝试读取文本文件中的行,标记该行,然后继续对 switch 和 break 块中的下一行执行相同操作,但是在我的程序到达第一个 break 之后,它退出循环并忽略文件的其余部分。
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 行的内容,我怎样才能转到下一行并一直这样做到文件末尾?
【问题讨论】:
-
出于好奇,您认为
firstLetter在评估声明char firstChar = line.at( firstLetter );时有什么价值?如果您的回答是“我不知道”,那么您的公司就很好,因为发布的代码也没有。该值为不确定。 -
@WhozCraig firstLetter 为 0;我通常会省略初始化整数,因为大多数情况下它们的默认值为零,但好在你赶上了这一点,为了清楚起见,我将对其进行编辑哈哈
-
好,认真地,改掉这个习惯。除非在 eval 之前直接赋值是不可避免的,否则初始化应该总是在实践中进行。随机机会不是您应该寻求的路径。也就是说,将
istringstreaminside 移动到 while-getline 并将其初始化为istringstream iss(line); -
@WhozCraig 工作!!!!!!!!!谢谢
标签: c++ string file-io tokenize stringstream