【问题标题】:How to understand the instructions of an istream function?如何理解 istream 函数的指令?
【发布时间】:2020-11-26 20:43:19
【问题描述】:

我正在向流写入一个函数,并且正在向 istream 读取函数。我的 ostream 函数如下所示:

 ostream& Time:: write(ostream& ostr)const {


      int hour;
      int minutes;

      hour = m_min / 60;
      minutes = m_min % 60;

     // Time::write(ostr);
      ostr << setfill('0') << setw(2) << hour;
      ostr << setfill('0') << setw(1) << ":";
      ostr << setfill('0') << setw(2) << minutes;

      return ostr;
   }
 std::istream& read(std::istream& istr);

从 H:M 格式的流中读取时间。它确保两个整数(小时和分钟)用“:”分隔,否则会将 istream 对象设置为失败状态。 (请参阅下面的步骤以了解如何)

请注意,此函数不会对任何无效数据作出反应。它只需遵循以下步骤:

  • 使用 istr 读取小时的整数

  • 读取一个字符并确保它是 ':',如果不是,将通过发出以下命令将 istream 对象设置为失败状态:

    istr.setstate(ios::failbit);
    
  • 使用 istr 读取分钟的整数

注意:请勿清除或刷新 istream,因为此方法符合 istream 标准。如果需要,该函数的调用者可以检查 istream 状态以确保读取成功。

到目前为止,这就是我所拥有的,但我不确定我是否得到了它要求我做的事情,或者我做得对:

   istream& Time::read(istream& istr) {
      int hour;
      int minutes;

      hour = m_min / 60;
      minutes = m_min % 60;


      istr >> hour;
      if (hour != ':') {
         istr.setstate(ios::failbit);
      }
      istr >> minutes;

      cout << hour << ":" << minutes << endl;

   }

我这样做对吗?如果不是,我应该如何解释这些说明?

【问题讨论】:

  • 我建议,如果您难以理解老师在作业中的指示,您应该与 他们 进行对话以澄清这一点,而不是随意的陌生人在互联网上。
  • m_min 来自哪里?您必须读取一个数字、一个字符和另一个数字。目前你只是在读两个数字。
  • @ThomasSablik 前缀m_ 通常代表“成员”,在输出函数中使用m_min 在这种情况下是有意义的。输入函数中的相同用法是一个明显的复制/粘贴错误

标签: c++


【解决方案1】:

没有;您将两步合二为一,因此错过了一次阅读。

说明书说:

  • 使用 istr 读取小时的整数
  • 读取一个字符并确保它是':'

相反,你这样做了:

  • 使用 istr 读取小时的整数并确保它是 ':'

您需要在char 中引入另一个读取操作,并使其对':' 的检查发生在char 而不是hours 上(这没有意义!)。


此外,这些行:

hour = m_min / 60;
minutes = m_min % 60;

…已经从输出函数中复制/粘贴,但在这种情况下没有任何意义,也没有做任何有用的事情。您可以删除它们。


在输入函数中cout 也很奇怪,但如果您只是在开发时临时进行调试,那也没关系。


最后,您需要return istr,就像您之前使用return ostr 一样。 (你的编译器应该警告过你吗?)


除此之外,干得好!

【讨论】:

  • 感谢您为我解释这一点!
  • @katarachan 你打赌。祝你好运。
猜你喜欢
  • 2015-02-04
  • 2013-02-22
  • 2013-06-28
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多