方法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;
}