如何从文件中删除记录

时间:2016-05-24 17:40:28

标签: c

# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>

struct dnode{

char dlname[20],
dfname[20],
dtel[15];    
struct dnode *dnext;
};

int dmenu(); //main menu
void dadd(); //add to list
void dfind(); //search from the list
void dedit(); //edit the record
void ddel(); //delete from the list
void ddisp(); //display all
dnode* sort(dnode* head_node);

typedef struct dnode node;
node *dstart, *dtemp;


int dmenu()
{
int dch;
int i,j,n;
printf(" TELEPHONE DIRECTORY ");
printf(" =================== ");
printf(" \n1. Add ");
printf(" \n2. Find ");
printf(" \n3. Sort ");
printf(" \n4. Delete ");
printf(" \n5. Display All ");
printf(" \n6. EXIT ");
printf(" \nEnter your choice(1-6):");
scanf("%d", &dch);
return dch;
}

void dadd()
{
FILE *fp;
fp=fopen("record.txt","a");
node *dptr,*dprev;
dtemp=(node *)malloc(sizeof(node));
printf("First name: ");
scanf("%s", dtemp->dfname);
printf("Last name:");
scanf("%s", dtemp->dlname);
printf("Telephone No.: ");
scanf("%s", dtemp->dtel);
dtemp->dnext=NULL;
if(dstart==NULL) dstart=dtemp;
else {
dprev=dptr=dstart;
while(strcmp(dtemp->dfname,dptr->dfname)>0){
    dprev=dptr;
    dptr= dptr->dnext;
if (dptr == NULL) break;
 }
    if(dptr==dprev) {
        dtemp->dnext=dstart;
        dstart=dtemp;
  }
    else if(dptr==NULL)
        dprev->dnext=dtemp;
    else {
        dtemp->dnext=dptr;
        dprev->dnext=dtemp;
     }
 }
fprintf(fp,"%20s %20s %s\n",dtemp->dfname,dtemp->dlname,dtemp->dtel);
fclose(fp);
}
void dfind()
{
 FILE *fp;
 node *dptr;
 char dstr[20];
 fp=fopen("record.txt","r");
 if(dstart==NULL){
     printf("\n\t\t\tTelephone Directory is Empty....\n");
     getch();
     return;
     }
 printf("First Name to Find : ");
 scanf("%s",dstr);
 dptr=dstart;
 while(strcmp(dptr->dfname,dstr)!=0)
 {
     dptr= dptr->dnext;
     if (dptr == NULL) break;
 }
 if(dptr!=NULL) {
 printf("First Name : %s\n",dptr->dfname);
 printf("Last Name : %s\n",dptr->dlname);
 printf("Phone Number : %s\n",dptr->dtel);
 }
 else {
     printf("No Matching Records Found .......\n");
 }
 fclose(fp);
 getch();
}

这是我的排序功能,如何在文件中对记录进行排序?

dnode* sort(dnode* head_node)
{
  dnode *prev, *curr = head_node;
  int i, list_size = 0;

   /* Determine the size first */
   while (curr != NULL)
   {
   list_size++;
   curr = curr->dnext;
   }

   /* sorting */
   for (i = 1; i < list_size; i++)
   {
       curr = head_node;
       while (curr->dnext != NULL)
       {
           if (strcmp(curr->dfname, curr->dnext->dfname) > 0)
           {
           dnode* next_node = curr->dnext;
           curr->dnext = next_node->dnext;
           next_node->dnext = curr;

           if (curr == head_node)
               head_node = next_node;
           else
               prev->dnext = next_node;

               curr = next_node;
           }
           prev= curr;
       curr = curr->dnext;
       }
    }

   return head_node;
}

这是我的删除功能,任何人都可以帮我解决文件中的删除记录吗?

void ddel()
 {
  node *dptr,*dprev,*dtemp;
  char dstr[20],dyn='n';
  struct dnode record;

  if(dstart==NULL) {
    printf("\n\t\t\tTelephone Directory is Empty....\n");
    getch();
    return;
 }
 printf("First Name to Delete : ");
 scanf("%s",&dstr);

 dprev=dptr=dstart;

while (strcmp(dptr->dfname,dstr)!=0)
{
dprev=dptr;
dptr= dptr->dnext;
 if (dptr == NULL) 
 break;
}
if(dptr!=NULL){
    printf("\nDeleting Record.....Confirm [y/n]: ");
    dyn=getch();
    printf("\n\n---------------------------------------------------------");
    printf("\nFirst Name : %s\n",dptr->dfname);
    printf("Last Name : %s\n",dptr->dlname);
    printf("Phone Number : %s\n",dptr->dtel);
    printf("---------------------------------------------------------");
    if(dyn=='y') {

        if (dptr==dstart) {
            dtemp=dstart->dnext;
            free(dstart);
            dstart=dtemp;
        }
        else {

            dtemp=dptr->dnext;
            free(dptr);
            dprev->dnext=dtemp;
        }

        printf("\n\n1 Record Deleted....");
    }
    else
        printf("\n\nRecord not Deleted....");
}
 else {
    printf("\nNo Matching Records Found .......");
 }
getch();
}

void ddisp()
{
 FILE *fp;
 struct dnode rec;

 fp=fopen("record.txt","r");
 node *dptr;
if(dstart==NULL) {
    printf("\n\t\t\tTelephone Directory is Empty....\n");
    getch();
    return;
}
printf("\t\t------------------------------\n");
for(dptr=dstart; dptr!=NULL; dptr=dptr->dnext) {
    printf("\t\tFirst name: %s", dptr->dfname);
    printf("\n\t\tLast name:%s", dptr->dlname);
    printf("\n\t\tTelephone No.: %s", dptr->dtel);
    printf("\n\t\t------------------------------\n");
 }
fclose(fp);
getch();
}

int main()
{
int dch;
int i,j,n;
dstart=(node *)malloc(sizeof(node));
dstart=NULL;
do{
    dch=dmenu();
    switch(dch) {
        case 1: dadd();
                    break;
        case 2: dfind();
                    break;
        case 3: dstart = sort(dstart);;
                    break;
        case 4: ddel();
                    break;
        case 5: ddisp();
                    break;
  }
 }while(dch!=6);
}

我已完成此代码,但我无法删除和排序record.txt文件中的记录。

2 个答案:

答案 0 :(得分:1)

要对文件进行排序:读取所有记录,在内存中对它们进行排序,然后在刷新的文件中写入所有记录(以w模式打开它以将其重置为空文件)。如果有太多记录要在内存中处理它们,您可能需要找到一些替代方法(索引会更合适)。

要删除:您无法删除文件中的内容,您需要重写大部分文件。如果没有那么多记录,请读取所有记录,从内存结构中删除该记录,然后重写一个新文件。在记录太多的情况下,您可能会找到一些替代方案。

答案 1 :(得分:0)

首先问自己一些关于你的程序应该如何处理添加/存储/搜索和删除记录的问题。只有在此开始修改它之后。

例如。你想在磁盘或内存中处理你的数据吗?如果您希望以列表的形式处理内存中的电话列表 - 您何时将内存中的内容与磁盘上的内容同步?至于现在,当你必须打开关闭数据文件时,或者我们的建议应该集中在删除/排序内存或磁盘上的记录时,你的代码还不清楚。

即使没有粗略的设计,您也有太多方法可以改变您的计划。

相关问题