-2
system("cls");
            another = 'y';
            while(another == 'y')
            {
                printf("\nEnter name of employee to delete ");
                scanf("%s",empname);
                ft = fopen("Temp.dat","wb");
                rewind(fp);
                while(fread(&e,recsize,1,fp) == 1)
                {
                    if(strcmp(e.name,empname) != 0)
                    {
                        fwrite(&e,recsize,1,ft);
                    }
                }
                fclose(fp);
                fclose(ft);
                remove("EMP.DAT");
                rename("Temp.dat","EMP.DAT");
                fp = fopen("EMP.DAT", "rb+");
                printf("Delete another record(y/n)");
                another = getche();
            }

これは、従業員名を使用して c のバイナリ ファイルからエントリを削除するコードです。しかし、emp idで削除したい場合、エントリは削除されませんが、ファイルのすべての内容が削除されます!

case '4':
            system("cls");
            another = 'y';
            while(another == 'y')
            {
                printf("\nEnter employee id to delete ");
                scanf("%d",&empid);
                ft = fopen("Temp.dat","wb");
                rewind(fp);
                while(fread(&e,recsize,1,fp) == 1)
                {
                    if(e.userid!=empid)
                    {
                        fwrite(&e,recsize,1,ft);
                    }
                }
                fclose(fp);
                fclose(ft);
                remove("EMP.DAT");
                rename("Temp.dat","EMP.DAT");
                fp = fopen("EMP.DAT", "rb+");
                printf("Delete another record(y/n)");
                another = getche();
            }
4

2 に答える 2

0

このscanf関数は、フォーマット文字列を受け取り、その後にターゲット変数のアドレスが続きます。したがって、 として定義empidしたと仮定するintと、変更する必要があります

scanf("%d",empid);

scanf("%d", &empid);

empnameは既に文字へのポインターであるため、名前で削除するコードでは問題は見られませんでした。メモリを割り当てたことを覚えていましたよ

于 2013-05-05T11:57:46.353 に答える