0

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

2 回答 2

2

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

于 2013-09-14T14:34:54.117 回答
0

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

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

如果行中的最后一个字符是 a' '很好:您退出此循环,但c=in.get();随后您将 char 换行符加载到 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();

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

于 2013-09-14T15:05:27.150 回答