使用c程序修改文件中的记录

时间:2015-11-17 18:12:57

标签: c file-handling

我已经编写了这个c程序来插入,查看,修改和删除文件中的记录。文件名是emp.dat。显示,添加和删除的代码工作正常,但修改部分不起作用。程序要求输入要修改的详细信息,但不会更新/修改任何内容。 守则:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
void main()
{
    FILE *outp,*inpt;
    char another,choice;
    struct emp
    {
        int emp_no,age;
        char name[40];
        float bs;
    };
    struct emp e;
    char empname[40];
    long int recsize;
    outp=fopen("emp.dat","r+");
    if(outp=='\0')
    {
        outp=fopen("emp.dat","w+");
        if(outp=='\0')
        {
            puts("cannot open file\n");
            exit(1);
        }
    }
    recsize=sizeof(e);
    while(1)
    {
        printf("1.Add records\n");
        printf("2.List records\n");
        printf("3.Modify records\n");
        printf("4.Delete records\n");
        printf("0. exit\n");
        printf("Your choice\n");
        fflush(stdin);
        choice=getche();
        switch(choice)
        {
            case '1':                           //code to add data
            .

            case '2':                        //code to display data

            case '3':                       //code to modify data
            another='Y';
            while(another=='Y')
            {
                printf("\nEnter name of employee to modify");
                scanf("%s",empname);
                rewind(outp);
                while(fread(&e,recsize,1,outp)==1)
                {
                    if(strcmp(e.name,empname)==0)
                    {
                        printf("\nenter new name,age & gs");
                        scanf("%d %s %d %f",&e.emp_no,&e.name,&e.age,&e.bs);
                        fseek(outp,-recsize,SEEK_CUR);
                        fwrite(&e,recsize,1,outp);
                        break;
                    }
                }
                printf("\nModify another record(Y/N)");
                fflush(stdin);
                another=getche();
            }
                        printf("\n\n");
            break;
            case '4':                         //code to delete data

            case '0':
            fclose(outp);
            printf("\n\n");
            exit(1);
        }
    }
}

enter image description here 从输出中可以看出,名称不会从Zaid变为Cow,年龄和gs也是如此。

1 个答案:

答案 0 :(得分:2)

你真的应该测试返回值。

提示要求name,age & gs,然后按要求输入。但是,scanf被指示首先获得整数(emp_no)("%d %s %d %f")。错过它立即失败,没有任何更新。

情况很容易被发现:scanf返回成功转换的次数。