为什么在打印B时会打印多余的空白行?

时间:2013-09-14 14:32:36

标签: c++

以下是从文本文件中获取输入的代码。我使用了charecter明智的阅读。当我打印B时,它仅在'rao'之后打印额外的行。

我的文本文件输入是:

1 singh
2 sen singh rao singh pal sen jain sen de rao 
3

这是代码

int main() {
  ifstream in;
  in.open( "Text.txt" );

  string s;
  while(getline(in,s)){
    char x;
    x=in.get();
    if(x=='1'){
      string s;
      in>>s;
    }

    if (x=='2'){
      char c;
      c=in.get();
      c=in.get();
      do{
        string A;
        string B;

        do{
          A=A+c;
          c=in.get();
        } while(c!=' ');

        c=in.get();

        do{
          B=B+c;
          c=in.get();
        } while(c!=' '&&c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7');

        cout<<B<<endl;
      }

      while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7');
      if(c!='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'){
        in.putback(c);
      }
    }
  }
}

2 个答案:

答案 0 :(得分:2)

std::endl插入换行符并刷新流。 如果您只想使用std::flush,请说实话,大多数情况下您都不需要。

答案 1 :(得分:0)

首先,您可能需要修改代码,就像忘记输入文件中行末尾的空白区域一样,在此处进入无限循环:

do{
  A=A+c;
  c=in.get();
} while(c!=' ');

如果该行中的最后一个字符是' ',那么就可以了:退出此循环但使用后面的c=in.get();将char换行符加载到c中。

字符串B上的while循环首先将c(这是一个换行符char)加载到空字符串B中。然后从文件中读取char 3,这样就可以退出循环。

现在很明显,cout会打印两个新行:一个在B中,另一个来自endl

如果您认为输入文件是这样的话,可能会更清楚:

1 singh[newline]2 sen singh rao singh pal sen jain sen de rao [newline]3

快速解决方案是在cout之前放置这条线:

if (B=="\n") B.clear();

我不确定代码的目标,因此我很难提出更好的设计。