我有一个程序列出学生,它可以添加新的,搜索甚至从学生编号中删除列表中的学生,它包含学生信息的结构。所有信息都在名为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();
}
答案 0 :(得分:3)
您不应该使用memcpy
来重叠内存部分。您应该使用memmov。正如memmov描述所述:
移动内存块 将num字节的值从source指向的位置复制到destination指向的内存块。复制就像使用中间缓冲区一样,允许目标和源重叠。
此外:
- 在找到学号后,您可以使用break
语句停止迭代第一个循环。
亲切的问候,
博
答案 1 :(得分:1)
通常的做法是
bool is_deleted
成员添加到struct student
。is_deleted
设置为true来更新结构。