【问题标题】:how to delete a record from a file in c (saved records are struct )如何从 c 中的文件中删除记录(保存的记录是 struct )
【发布时间】:2012-06-08 06:23:18
【问题描述】:

我有一个列出学生的程序,它可以通过学生编号添加新学生,甚至从列表中搜索甚至删除学生,它包含一个学生信息结构。所有信息都在一个名为 REG 的文件中.DAT 。我的问题出在 >>DELETE

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();
}

【问题讨论】:

    标签: c++ c io


    【解决方案1】:

    您不应该将memcpy 用于重叠的内存部分。您应该改用memmov。正如 memmov 描述所述:

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

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

    亲切的问候,

    【讨论】:

      【解决方案2】:

      通常的做法是

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

      【讨论】:

      • 嗯,这不一定是 通常的,有基于日志的方法(仅附加),但是编写一个新文件并自动重命名它的想法肯定更好而不是改变当前的权威文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多