【问题标题】:deleting a record using arrays使用数组删除记录
【发布时间】:2016-01-02 13:47:36
【问题描述】:

我是一个完整的 C++ 初学者,请耐心等待。我被要求编写一个程序,其中一个功能是从文件中删除一条记录并使用数组将其放置在另一个文件中(大小未知,因此计数器)。我尝试了许多不同的方法,但无济于事。现在我收到了abort() 错误,我真的不知道该怎么做或修复。非常需要您的帮助。

void DeletePatient ()
{
    ifstream infile;
    infile.open ("patients.txt");

    ofstream outfile;
    outfile.open ("deletedpatients.txt");

    int i=0, flag=0, counter=0, deleteID, deletedindex;

    //Read contents into array

    while(!infile.eof())
    {
        infile>>IDnumber[i]>> FirstName [i] >> LastName [i] >> PhoneNumber [i] >> Nationality [i];
        i++;
        counter++;
    }

    if ( !infile )
        cout << "Error opening file\n";
    else  
    {
        cout<<"Enter ID number of patient to be deleted\n";
        cin >> deleteID;

        for(i=0;i<counter;i++)
        {
            if(deleteID==IDnumber[i])
            {

                infile >> IDnumber [i] >> FirstName [i] >> LastName [i] >> PhoneNumber [i] >> Nationality [i];

                outfile << IDnumber [i] <<" "<< FirstName [i]<<" " << LastName [i]<<" " << PhoneNumber [i]<<" " << Nationality [i];

                flag++;

                for(deletedindex=i; i<counter; deletedindex++)
                {
                    IDnumber[deletedindex]=IDnumber[deletedindex+1];
                    FirstName[deletedindex]=FirstName[deletedindex+1];
                    LastName[deletedindex]=LastName[deletedindex+1];
                    PhoneNumber[deletedindex]=PhoneNumber[deletedindex+1];
                    Nationality[deletedindex]=Nationality[deletedindex+1];
                }

            }
        }

        infile.close();

        if(flag==0)
            cout<<"User does not exsist\n";
        else
        {
            ofstream updatefile;
            updatefile.open("patients.txt");

            for ( i=0 ; i < counter; i++ ) //update file
            {

                updatefile << IDnumber [i] <<" "<< FirstName [i]<<" " << LastName [i]<<" " << PhoneNumber [i]<<" " << Nationality [i];
            }   
            cout << "Patient is deleted" << endl;
            updatefile.close();
        }
    }

    outfile.close ();
}

【问题讨论】:

  • 数组的大小是多少?因为阅读时没有上限。此外,在删除数组中的最后一个元素时,deletedindex+1 可能不存在。
  • 错误发生在哪里?你是如何分配数组的?
  • 原来的大小是200,但是我用一个计数器来读取实际记录的数量,所以计数器是大小,至于我输入要删除的ID后发生的错误。

标签: c++ arrays file visual-c++


【解决方案1】:

我们看看这个循环的条件:

for(deletedindex = i; i < counter; deletedindex++)

icounter 在循环内部都没有被修改,所以一旦你进入,你就不会退出(没有未定义的行为) - 无限循环

也许,你的意思是这样的:

for(deletedindex = i; deletedindex + 1 < counter; deletedindex++)

无论如何,您的代码需要认真重构 - 使用 一个 具有这些属性的对象数组,也可以考虑使用 std::vector

【讨论】:

  • 非常感谢您的快速回复,但请问您为什么使用deletedindex+1 而不是deletedindex?这不会导致重复次数出现问题吗?
  • 因为您正在访问像IDnumber[deletedindex+1] 这样的元素,所以您必须少迭代一次。否则它将访问IDnumber[count],这是有效值末尾的一个,可能超出数组边界。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
相关资源
最近更新 更多