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

时间:2015-04-18 11:25:43

标签: 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 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;
}

我在mycomputer上运行它,它总是打印

wrong

但是我将此代码复制到另一个文件中,并运行它。我得到以下内容:

    terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

有没有人可以告诉我这有什么不同?

1 个答案:

答案 0 :(得分:0)

第一个结果意味着,在您的计算机上,没有名为"234"的文件;所以函数立即返回而不进入错误的循环。

第二个结果可能是因为循环测试了“文件结束”条件(但是错误地:你应该在尝试读取之后测试,因为只有当你尝试读取时才设置条件过去的结束),但不测试任何其他错误。如果任何输入错误,那么使用>>读取失败,循环将在每次读取失败后继续插入temp的副本。最终你会耗尽内存,这可以通过抛出bad_alloc异常来表示。

更正确的循环版本是:

Woker temp;
while (in >>temp.ID>>temp.Name>>temp.Salary>>temp.WorkYears) {
    A.push_back(temp);
}

将在文件末尾或任何输入失败时结束。如果您想报告错误,可以在之后检查in.eof()in.fail()