C语言:添加和显示,数据保存在文件中,下次打开可以获取之前录入的内容

方法1:fgets和fputs

#include <stdio.h>
#include<sys/ioctl.h>


int main(int argc, char const *argv[])
{
	FILE *fp=fopen("1.txt","a+");              //1.txt  文件名和路径     当运行 .c 文件和目标文件 1.txt在同一目录时可直接写文件名
												//"a+"	 表示1.txt  可读写,写的时候在文件末尾开始写							
	if(!fp)                                   
	{
		perror("fopen");
		return 0;
	}

	while(1)
	{
		printf("请输入操作:1添加  2显示  0退出  ");
		int num;
		while(scanf("%d",&num) != 1)
			{
				printf("输入错误!!请重新输入  ");
				scanf("%*[^\n]");
				scanf("%*c");
			}
			scanf("%*[^\n]");                //清除输入缓存
			scanf("%*c");
		if(num==1)                                      //添加
		{

			printf("姓名 ID 年龄 薪资\n");
			char a[100];
			fgets(a,20,stdin);

			fputs(a,fp);

		}

		else if(num==2)                                 //显示全部
		{
			char ch[100]={};

			fclose(fp);                       //关闭清除,
			FILE *fp=fopen("1.txt","a+");       //再从新打开

			if(!fp)
			{
				perror("fopen");
				return 0;
			}

			printf("姓名    ID      年龄      薪资\n");

			while(1)
			{
				


				if(fgets(ch,10,fp)==NULL)         //判断
				{
					if(feof(fp))                 //判断是否到文件尾
						break;
				}
				fputs(ch,stdout);
			}
		}


		else if(num==0)              //关闭退出
		{
			fclose(fp);
			return 0;
		}
	
	}	
	
	return 0;
}

方法2:fread和fwrite

小瑕疵:存储在emp.dat文件中的数据用电脑打开

打开可能会乱码,这是因为程序保存是用ascii编码保存的

方法1不会出现这种情况

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

typedef struct{
    char name[20];
    int id;
    int age;
    float salary;
}emp;

void add_emp()
{
    emp ep;
    FILE *fp = fopen("emp.dat","a");         //"emp.dat"  文件名   "a"可写,在文件末尾写
    if(!fp){                                 //判断文件是否fopen成功
        perror("fopen");
        exit(0);
    }

    printf("请输入员工姓名:");
    fgets(ep.name,20,stdin);
    while(strlen(ep.name)==19&&ep.name[18]!='\n'){
        printf("输入的名字过长,请重新输入:");
        scanf("%*[^\n]");
        scanf("%*c");
        fgets(ep.name,20,stdin);
    }
    ep.name[strlen(ep.name)-1] = '\0';//去掉最后的换行符

    printf("请输入员工编号:");
    scanf("%d",&ep.id);

    printf("请输入员工年龄:");
    scanf("%d",&ep.age);

    printf("请输入员工工资:");
    scanf("%g",&ep.salary);

    //将信息写入文件
    fwrite(&ep,sizeof(emp),1,fp);

    fclose(fp);
}

void display_emp()
{
    emp ep;
    FILE *fp = fopen("emp.dat","r");
    if(!fp){
        perror("fopen");
        exit(0);
    }


    printf("员工姓名\t员工编号\t员工年龄\t工资\n");
    while(fread(&ep,sizeof(emp),1,fp)){
        printf("%s\t\t%d\t\t%d\t\t%g\n",ep.name,ep.id,ep.age,ep.salary);
    }
    
    fclose(fp);
}

int main()
{
    int choice = 0;

    while(1){
        printf("1.添加人员\n");
        printf("2.显示人员\n");
        printf("3.退出\n\n");
        printf("请选择:");

        while(scanf("%d",&choice)!=1){
            printf("输入错误,请重新输入:");
            scanf("%*[^\n]");
            scanf("%*c");
        }
        scanf("%*[^\n]");
        scanf("%*c");

        switch(choice){
            case 1:
                //printf("添加人员!\n");
                add_emp();
                break;
            case 2:
                //printf("显示所有人员!\n");
                display_emp();
                break;
            case 3:
                exit(0);
                break;
            default:
                printf("选择选项不存在,请重新选择\n");

        }
        getchar();
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41215479/article/details/81179287