C++ C++;:相同的代码,不同的结果

C++ C++;:相同的代码,不同的结果,c++,C++,今天我的同学让我帮她调试代码如下: int main(int argc, char *argv[]) { vector<Woker> A; int a; a = read_txt("234",A); if( a==-1 ) { cerr<<"wrong"<<endl; } // else // { // print(A); // } return 0; } int rea

今天我的同学让我帮她调试代码如下:

int main(int argc, char *argv[])
{
    vector<Woker> A;
    int a;
    a = read_txt("234",A);
    if( a==-1 )
    {
        cerr<<"wrong"<<endl;
    }
//  else
//  {
//      print(A);
//  }
    return 0;
}

int read_txt(string filename,vector<Woker> & A)
{
    ifstream in(filename);
    if( !in )
    {
        return -1;
    }

    while( !in.eof())
    {
        Woker temp;
        in >>temp.ID>>temp.Name>>temp.Salary>>temp.WorkYears;
        A.push_back(temp);
    }
    in.close();
    return 0;
}
    terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
但是,我将此代码复制到另一个文件中并运行它。我得到以下结果:

int main(int argc, char *argv[])
{
    vector<Woker> A;
    int a;
    a = read_txt("234",A);
    if( a==-1 )
    {
        cerr<<"wrong"<<endl;
    }
//  else
//  {
//      print(A);
//  }
    return 0;
}

int read_txt(string filename,vector<Woker> & A)
{
    ifstream in(filename);
    if( !in )
    {
        return -1;
    }

    while( !in.eof())
    {
        Woker temp;
        in >>temp.ID>>temp.Name>>temp.Salary>>temp.WorkYears;
        A.push_back(temp);
    }
    in.close();
    return 0;
}
    terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

有没有人能告诉我是什么原因造成了这种不同?

第一个结果意味着,在您的计算机上,没有名为
“234”的文件。
;因此,函数会立即返回,而不会进入buggy循环

第二个结果可能是因为循环测试“文件结束”条件(但错误:您应该在尝试读取后进行测试,因为只有在尝试读取超过结束时才设置该条件),但不测试任何其他错误。如果任何输入错误,导致使用
>
读取失败,循环将在每次读取失败后继续插入
temp
的副本。最终您将耗尽内存,这通过抛出
bad\u alloc
异常来指示

更正确的循环版本是:

Woker temp;
while (in >>temp.ID>>temp.Name>>temp.Salary>>temp.WorkYears) {
    A.push_back(temp);
}
它将在文件末尾或任何输入失败时结束。如果要报告错误,可以在.eof()中检查
并在.fail()中检查