C++ 如何使用Cin首次启用输入流?

C++ 如何使用Cin首次启用输入流?,c++,overloading,operator-keyword,cin,C++,Overloading,Operator Keyword,Cin,我需要将一个很长的Int读入我正在创建的一个长Int类,我正在重载cin>操作符。用户必须一次输入完整的数字。例如:444444444 我计划使用cin.get()并将结果转换为int,这样我就可以从流中获取第一个4,但它不起作用。有人能帮我提些建议吗 istream& operator>>(istream &input, LongInt &longint) { int check; //// int first; first = (int)(ci

我需要将一个很长的Int读入我正在创建的一个长Int类,我正在重载
cin>
操作符。用户必须一次输入完整的数字。例如:
444444444

我计划使用
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;
}
istream&operator>>(istream&input,LongInt&LongInt)
{
整数检查////
int优先;
first=(int)(cin.get());
纵向堆叠推压(第一);

cout当您需要解析输入时,您可能会单独处理字符。为此,我个人会使用
std::istreambuf\u迭代器
,尽管您也可以使用
std::istream::get()
。后者将返回一个
int
值,表示一个
char
它将返回一个已到达流末尾的指示,即值
std::char\u traits::eof()
。使用
std::istreambuf\u迭代器
您只需像处理任何其他序列一样处理一个序列即可获得相同的检查,因此我的偏好。在这两种情况下,您可能都应该开始跳过空白,因为这可能是一个分隔符。由于输入是解析的,因此最简单的方法是使用
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;
}
std::istream&operator>>(std::istream&in、LongInt&LongInt){
std::istream::sentry kerberos(in);
if(kerberos){
std::istreambuf_迭代器it(in),end;
if(it==end | |!std::isdigit(static_cast(*it))){
std::setstate(std::ios_base::failbit);
}
while(it!=end&&std::isdigit(static_cast(*it))){
//用下一个数字做点什么
}
}
返回;
}

使用
cin.get()
,您只得到一个字符,它被视为
字符。
。为什么不将输入作为字符串,并根据您的喜好解析字符串?好吧,我从来没有想过。所以您是说使用get line并将其存储在字符串中?或者类似的正确方法?是的,尽管根据数字的大小,您可以使用
long类型是64位,与32位相比,
int
,还有其他类型用于更大的整数,看看这个堆栈溢出问题。我相信C++11支持将
long
类型作为cin提取运算符的参数。这对我不起作用。有人知道如何解决这个问题吗?string line;getline(cin,line);Dude lrn2能接受答案吗..我能用不太复杂的东西吗?不太确定我能不能用复杂的信息。谢谢你的回答和建议effort@JustinBalingit:您认为您不需要代码的哪一部分?我认为您需要全部代码(事实上,我忘记了处理这个案例,当时根本没有任何数字可以将流放入fail stated;现在添加)。