读取所有数据后无限cin循环

时间:2012-03-13 17:53:50

标签: c++ loops cin

解决: 根据关于具有固定大小的两个响应,我确实有一个用于数组大小的私有var。

简单解决方案:while(i< rhs.size)或for循环


我从这段代码中获得了一个无限循环。主要是我输入1 2 3 4 5

问题是即使在读完所有5个int后,系统仍在等待更多输入。如果我输入另一个int,它将再次进入循环。

template <typename T>
istream& operator>> <>(istream& in, MyArray<T>& rhs)
{
    int i = 0; 
    while(!in.eof()) //I tried: while(in >> rhs.theArray[i]) as well, no go
    {
        in >> rhs.theArray[i];
        i++;
    }
    return in;
}

3 个答案:

答案 0 :(得分:0)

可以肯定地说,你永远不应该写while(!in.eof()) {

在读取尝试之后设置为,而不是之前。相反,最好做这样的事情:

T x;
while(in >> x) {
    rhs.theArray[i] = x;
    ++i;
}

这样做是尝试从流中提取项目。如果在提取之后流仍处于“良好”状态,则执行循环体,否则,不变量失败并且循环终止。

在最后,这使得循环条件“我可以成功获得另一个项目......”

这是一种更好的方法,因为它还可以处理除EOF之外的条件。

答案 1 :(得分:0)

由于您的rhs.Array很可能是一个固定大小(除非您正在进行operator[]的某些花哨重载以正确扩展底层内存数组),您应该只接受输入以获得最大数量的空格是你的数组的大小,而不是使用理论上会导致缓冲区溢出的while循环。

一般情况下,我会遵循以下两条规则从命令行获取可变数量的输入:

  1. 根据数组中预定义的空间定义最大读取次数,以防止缓冲区溢出。
  2. 如果要使用istream::peak()之类的内容提早退出,请检查转义字符...请记住,必须使用CTRL-D命令行显式发送EOF命令行-line从文件中重定向等....转义字符的更好选择是行尾字符,如换行符,回车符(Windows)等。

答案 2 :(得分:0)

你应该有一个int var命名大小来存储固定大小,一旦你这样做,你可以读入int i = 0;我&lt;大小,这应该可以解决你的问题。