0

C プログラミングでのシーケンシャル ファイル アクセスについて教えてください。次のコードは、私が書いたコードの一部です。

レコードを挿入したり、レコードを検索したり、すべてのレコードを表示したりできますが、変更と削除に関しては、必要な結果を得ることができません。この場合、私に指示してもらえますか?

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

int c,i,id;
char name[20];
FILE *fp;
int n;
int search(FILE *fp,int id);
void display(FILE *fp);

typedef struct details
{
    int id;
    char name[20];
}details;

details d;


void main()
{
    printf("\nHow many records you would like to insert ? : ");
    scanf("%d",&n);
    fp=fopen("one.txt","a");
    for(i=0;i<n;i++)
    {
        printf("\nEnter id and name");
        scanf("%d%s",&d.id,d.name);
        fwrite(&d,sizeof(d),1,fp);
    }
    fclose(fp);


    while(1)
    {
        printf("\nWhat would you like to do now ? : \n");
        printf("\n1.Display \t2.Search \t3.Modify \t4.Delete \t5.Exit");
        scanf("%d",&c);
        switch(c)
        {
            case 1:
                fp=fopen("one.txt","r+");
                display(fp);
                fclose(fp);
                break;
            case 2:
                fp=fopen("one.txt","r+");
                printf("\nEnter ID to search : ");
                scanf("%d",&id);
                if(search(fp,id))
                {
                    printf("\nThe record is as follows : ");
                    printf("\n%d\t%s",d.id,d.name);
                }
                else
                    printf("\nRecord not found");
                fclose(fp);
                break;
            case 3:
                fp=fopen("one.txt","r+");
                printf("\nEnter ID to modify d record : ");
                scanf("%d",&id);

                if(search(fp,id))
                {
                    printf("\nEnter new name");
                    scanf("%s",d.name);
                    fwrite(&d,sizeof(d),1,fp);
                }
                else
                    printf("\nSpecified record not found ");
                fclose(fp);
                break;              
        }
    }
}                           

int search(FILE *fp,int id)
{
    rewind(fp);
    while(fread(&d,sizeof(d),1,fp))
    {
        if(id==d.id)
        return 1;
    }
    return 0;
}

void display(FILE *fp)
{
    rewind(fp);
    while(fread(&d,sizeof(d),1,fp))
    {
        printf("\n%d\t%s",d.id,d.name); 
    }
}
4

3 に答える 3

2

固定サイズのレコードを使用しているため、変更は簡単です。エントリを検索して、新しいレコードを古いレコードに上書きするだけです。レコードを検索した後は、レコードの先頭までさかのぼって検索する必要があることに注意してください。

レコードの削除に関しては、それはより困難です。ここでは、実際には、削除するレコードを除くすべてのレコードを一時ファイルに書き込み、一時ファイルの名前を元のデータ ファイルとして変更する必要があります。または、すべてメモリ内で実行してから、メモリのレコードでファイルを最初から書き直します。

于 2013-08-02T07:39:23.277 に答える
0

問題は、ファイルの途中からデータを削除できないことです。したがって、できることは、ファイル全体を最初から (直接またはコピーを使用して) 書き直すか、レコードを削除済みとしてマークすることだけです。もちろん、これによりファイルサイズはそのままになります。時々、削除されたすべてのレコードを削除してファイルを書き直して、ファイルを再度圧縮することができます。

これが実行可能なアプローチであるかどうかは、実際にレコードを削除する頻度に依存します。もちろん、レコードが削除された場合は、後でレコードを挿入するときに、新しいレコードで上書きできます。

于 2013-08-02T07:49:36.720 に答える