C ++使用条件语句读取文本文件

时间:2015-07-16 01:54:16

标签: c++ string file-io tokenize stringstream

我正在尝试读取文本文件中的行,对行进行标记,然后继续对切换中的下一行执行相同操作并打破块,但是在我的程序到达第一个中断后,它退出循环并且忽略文件的其余部分。

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行的内容,如何进入下一行并继续这样做直到文件结尾?

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