【问题标题】:C++11 - drop input from streamC++11 - 从流中删除输入
【发布时间】:2015-12-30 16:39:10
【问题描述】:

如果我有一个程序在开始下一个问题之前可能需要最多 n 行输入来解决问题,我需要在程序可以解决问题时丢弃属于旧问题的所有输入行在阅读所有输入之前。

当然,我可以简单地循环直到我到达新问题的输入,但是读取和存储所有这些数据可能会很昂贵。有没有办法简单地告诉输入流忽略下一个这么多的值?

【问题讨论】:

标签: c++ c++11 io cin


【解决方案1】:
void discardLines(std::istream &in, std::size_t count)
{
    if (!in)  
       return;

    for (auto i = count; i != 0; --i)
         in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

并使用任何istream 类型调用它,例如cinifstreamistringstream

Referencestd::basic_istream::ignore

【讨论】:

  • 像魅力一样工作,谢谢。我认为值得一提的是,当您在一行中有几个整数并读取所有整数时,对应的\nnot 读取的。 (在我的情况下,这意味着我必须使用 i++ 而不是我预期的 ++i。)
  • @User1291 是吗?我的意思是,for 中有一个错误,因为我写的是(count != 0 而不是i != 0)。你能用一些在线编译器的例子来说明你的意思吗?
  • 当然。这会吗? ideone.com/zmRw0V# 顺便说一句,numeric_limits 似乎不是标准的一部分,但需要包含
  • 是的,它位于limits。换行符的问题是 ignore 是一个 UnformattedInput 函数,即 \n 被认为是一个实际字符(未格式化的函数 -cin.get() 等会读取它)而处理格式化输入的函数不会,比如cin &gt;&gt; myChar。这就是为什么不建议混合格式化和非格式化输入的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2014-04-18
  • 2011-09-14
相关资源
最近更新 更多