如何从c中的文件中删除记录(保存的记录是struct)

时间:2012-06-08 06:23:18

标签: c++ c io

我有一个程序列出学生,它可以添加新的,搜索甚至从学生编号中删除列表中的学生,它包含学生信息的结构。所有信息都在名为REG的文件上.DAT。我的问题出在>> DELETE<< part.i想要通过学生编号从列表中删除学生,但是当我这样做时,我将列表的其余部分丢失到必须删除的人。请帮我解决这个问题。我的代码是:

void _remove()
{
    int std_num = 0 , k ;
    int status = 1 , i = -1 , j = 0  ; 
    struct students read[100] ,temp;
    FILE *p ;

    p = fopen("reg.dat","rb");
    if(!p)
    {
        system("cls");
        cout << ">>>>>Register file could not be opened! call the support .<<<<<" << endl;
        _menu();
    }
    while(!feof(p))
    {
        fread(&read[i],sizeof(struct students),1,p) ;
        i++;
    }
    cout << "Enter STD NO. to delete from the list : " << endl ;
    cin >> std_num ;
    for( j = 0 ; j < i ; j++)
    {
        if(std_num == read[j].std_num)
        {
            for( k = j + 1 ; k < i ; k++)
            {
                memcpy(&read[k-1] , &read[k],sizeof (students));
            }
        }
    }
    fclose(p);

    FILE *fp;
    fp = fopen("reg.dat","wb"); 
    for( int l = 0 ; l < i - 2 ; l++)
        fwrite(&read[l], sizeof(struct students), 1 ,fp );
    fclose(fp);
    system("cls") ;
    cout << "STD with NO. " << std_num << " has been removed" << endl ; 
    _menu();
}

2 个答案:

答案 0 :(得分:3)

您不应该使用memcpy来重叠内存部分。您应该使用memmov。正如memmov描述所述:

移动内存块 将num字节的值从source指向的位置复制到destination指向的内存块。复制就像使用中间缓冲区一样,允许目标和源重叠。

此外:
- 在找到学号后,您可以使用break语句停止迭代第一个循环。

亲切的问候,

答案 1 :(得分:1)

通常的做法是

  • bool is_deleted成员添加到struct student
  • 删除学生时,请将is_deleted设置为true来更新结构。
  • 阅读学生记录时,请忽略已删除的记录。
  • 提供一个按记录读取整个文件记录的过程,并将其复制到另一个文件,跳过已删除的记录。然后将此其他文件重命名为原始名称。定期或在程序启动时调用此过程,或仅根据需要手动调用此过程。