【问题标题】:Program isn't performing file operations correctly [duplicate]程序未正确执行文件操作 [重复]
【发布时间】:2019-11-29 16:49:10
【问题描述】:

尽管输入了“y”,但代码不接受更多输入。 这么多部分没有产生所需的结果。

代码块:

char ch='y';
of.open("FileHandling.txt", ios::app);          //opening file.
while(ch=='y')
{
  cout<<"\n\n\t\tEnter contents in the file : \n\n\t\t";
  getline(cin, content);
  of<<content;
  cout<<"\n\n\t\tWish to write more ( y / n ) ? : ";
  cin>>ch;
}
of.close();         //closing file.

程序应根据用户的意愿接收未完成的输入。 然后它应该显示文件的内容。它正在显示内容。

【问题讨论】:

  • 在同一流上混合面向行的输入 (getline()) 和格式化输入 (cin &gt;&gt; ch) 会导致奇怪的交互,因为不同的方法处理换行符和其他空格的方式不同。例如,当读取cin &gt;&gt; ch 并且用户输入Y 后跟一个换行符,然后是Hello,那么ch 将具有值Y,换行符将导致getline 返回没有内容,H 将被cin &gt;&gt; ch 读取,因此该行的其余部分将被丢弃。简单的解决方案:使用一种方法或另一种方法从cin 读取所有输入。不要混合它们。

标签: c++ io


【解决方案1】:

你需要吃掉换行符。一种方法是使用std::istream::ignore,如下所示:

cout<<"\n\n\t\tWish to write more ( y / n ) ? : ";
cin>>ch;
cin.ignore();

想想你,用户(而不是程序员),当你被问到“希望写更多(y / n)吗?:”时会做什么。

例如,您输入“y”,然后按 Enter。该 Enter 是换行符,它将在 STDIN 缓冲区中等待被使用。

该换行符被getline() 占用,这就是为什么不会提示您输入内容的原因,因为函数调用已经终止(因为它完成了它的工作,它从 STDIN 缓冲区读取了一个字符串)。

通过忽略换行符,getline() 函数将被调用并等待用户输入内容...

【讨论】:

  • 法兹不客气!也欢迎来到 Stack Overflow!
【解决方案2】:

通过

输入单个字符时
cin >> ch;

换行符被放入cin流中(输入yn后,你也可以点击Enter换行)。然后在循环中执行getline,读取所有字符,直到出现新行。并且这个函数工作正常,它读取 0 个字节 - 这样的字符数在输入的换行符之前。

要忽略这一新行并阅读content,请使用cin.ignore()

cin>>ch;
cin.ignore();

【讨论】:

  • 谢谢!它达到了目的。我完全忽略了“忽略”。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2019-05-04
  • 2014-07-10
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多