如何使用Cin第一次启用输入流?

时间:2015-01-11 06:02:03

标签: c++ overloading operator-keyword cin

我需要在非常长的Int中读入我正在制作的Long Int类,我正在超载cin >>运算符。用户必须立即输入整个号码。例如:444444444444444444444444444

我计划使用cin.get()并将结果转换为int,这样我就可以从流中获取第一个4,但它无效。有人可以帮我提一下任何提示/建议吗?

istream& operator>>(istream &input, LongInt &longint)
{
  int check; ////
  int first;
  first = (int)(cin.get());
  longint.stack_li.push(first);
  cout << first;
  //while (isdigit((int)(input.peek())))
  //{

  //  longint.stack_li.push((int)(check = input.get()));
  //  cout << check;
  //}
  return input;
}

stack_li只是我所包含的头文件中的stack(不是STL&#39;)我将stack作为类{{1}的私有变量当我的程序运行时,当我输入数字5796为LongInt时,输出为55或57或一些随机的2位数字,这显然是错误的。请告诉我!! 非常感谢!!

1 个答案:

答案 0 :(得分:4)

当您需要解析输入时,您可能会单独处理字符。为此,我个人会使用std::istreambuf_iterator<char>,尽管您也可以使用std::istream::get()。后者将返回int代表一个 char 它将返回指示已到达流的末尾,即值std::char_traits<char>::eof()。使用std::istreambuf_iterator<char>你只需处理一个与其他序列一样的序列来获得相同的检查,因此我的偏好。在这两种情况下,您可能应该开始跳过空格,因为这可能是一个分隔符。由于无论如何都要解析输入,最简单的方法是使用std::istream::sentry。把它们放在一起,你会有这样的事情:

std::istream& operator>> (std::istream& in, LongInt& longInt) {
    std::istream::sentry kerberos(in);
    if (kerberos) {
        std::istreambuf_iterator<char> it(in), end;
        if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
            std::setstate(std::ios_base::failbit);
        }
        while (it != end && std::isdigit(static_cast<unsigned char>(*it))) {
            // do something with the next digit
        }
    }
    return in;
}