【问题标题】:why extra blank line is printed while printing B?为什么打印B时会打印额外的空白行?
【发布时间】:2013-09-14 14:32:35
【问题描述】:

这是从文本文件中获取输入的代码。我使用了字符明智的阅读。当我打印 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);
      }
    }
  }
}

【问题讨论】:

  • 你在每一行之后连接endl。当然,你最终会得到一个整理新线
  • 您可以使用普通的while 而不是do while 并在循环的开头打印endl
  • 即使我不使用 endl 输出也是 :"singhsinghsensenrao" 带换行符
  • 建议,而不是比较所有!=,尝试类似:unsigned int value; in &gt;&gt; value; } while ((value &gt; 0) &amp;&amp; (value &lt; 8));
  • 好吧,这里有更好的方法来传达 Q.:我将文本输入为 1 nikhil 2 amit nikhil arpit amit ramesh tushar 3(3 写在新行中)单击此处查看快照:s24。 postimg.org/kugjbp11h/utkarsh_debug.png

标签: c++


【解决方案1】:

std::endl 插入换行符并刷新流。 如果您只想刷新使用std::flush,但老实说大多数时候您都不需要。

【讨论】:

  • 你会用什么来代替?
  • @italy 大多数时候你不需要刷新
  • 这是意大利而不是意大利。但是你有什么替代std::endl 的方法?你说most of the time you need neither
  • @itay 您通常不想干扰流的缓冲方式。话虽如此,有特殊情况,您需要/使用显式刷新会更安全。
  • @Itay stream &lt;&lt; std::endl 等价于stream &lt;&lt; '\n' &lt;&lt; std::flush。也就是说,它是“插入换行符并刷新流”的组合命令。
【解决方案2】:

首先你可能想修改你的代码,就好像你忘记了输入文件中行尾的空白一样,你在这里进入了一个无限循环:

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

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

字符串 B 上的 while 循环首先将 c(这是一个换行符)加载到空字符串 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();

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
相关资源
最近更新 更多