怎么用C语言向一个TXT文件中每输入一个结构体,然后自动换行
#include <stdio.h> #include <stdlib.h>
#include <string.h>
#include <conio.h>
struct record
{
char name[20]; //姓名
char street[20]; //街道
char city[20]; //城市
char eip[20]; //邮编
char state[20]; //国家
}people[500];//500个记录,可修改
struct pnode
{
record data;
};
typedef pnode * linklist;
linklist l;//链表
int len=0;//链表长度
FILE *fp; //文件指针
void mainmenu();//主菜单
void searchmenu();//查询菜单
void enter();//添加新纪录
void search();//按条件搜索记录
void display();//显示全部记录
void load();//载入文件内容
void save();//写入文件
void del();//删除记录
void main() //主函数
{
load();
while (1)
mainmenu(); //进入主菜单,有非法输入仍停留在主菜单
}
void load()//装载已有文件信息到内存(数组)中
{
if((fp=fopen("通讯录信息.txt","rb"))==NULL) //以只读二进制(rb)的方式打开“通讯录信息.txt” 接着把返回值给fp 如果返回值时NULL说明文件打开失败了
{
printf("\n\t\t通讯录文件不存在");
if ((fp=fopen("通讯录信息.txt","wb"))==NULL) //如果以只写、二进制(wb)的方式“通讯录信息.txt” 接着把返回值给fp 如果返回值时NULL说明文件打开失败了
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录文件已建立");
printf("\n\t\t按任意键进入主菜单");
getch();
return;
}
exit(0);
}
//读取文件功能部分
fseek(fp,0,2); //移动文件的位置指针到文件的末尾
if (ftell(fp)>0) //如果文件的长度大于0 表示文件中有数据
{
rewind(fp);//这是一个反绕函数,使得文件的位置指针定位在文件的开头
for(
len=0;
!feof(fp)&&fread(&people[len],sizeof(struct record),1,fp);
len++);//从文件中读取数据,并统计读出数据的个数,每次从文件中读取一个数据,一直读到文件的末尾
fprintf(fp,"\n");
printf("\n\t");//printf("\n\t");printf("\n\t");
printf("\n\t\t文件读取成功");
printf("\n\t");
printf("\n\t\t按任意键返回主菜单");
getch(); //文件中读取一个字符
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
void mainmenu()//主菜单
{
char ch;
system("cls");
printf("\n");printf("\n");printf("\n");
printf("\n\t\t***********************************************");
printf("\n\t\t** 欢 迎 进 入 通 讯 录 系 统 **");
printf("\n\t\t** 1--新建联系人 **");
printf("\n\t\t** 2--查找联系人 **");
printf("\n\t\t** 3--删除联系人 **");
printf("\n\t\t** 4--保存联系人 **");
printf("\n\t\t** 5--退出程序 **");
printf("\n\t\t***********************************************");
printf("\n\t\t\t请选择:");
printf("%c ",ch=getch());
switch (ch)
{
case '1':enter();break;
case '2':searchmenu();break;
case '3':del();break;
case '4':save();break;
case '5':exit(0);
default:mainmenu();
}
}
void enter()//添加新纪录
{
printf("\n\t\t**************** 请输入学生信息 ****************\n");
printf("\n\t\t姓名:");
scanf("%s",&people[len].name);
printf("\n\t\t街道:");
scanf("%s",&people[len].street);
printf("\n\t\t城市:");
scanf("%s",&people[len].city);
printf("\n\t\t邮编:");
scanf("%s",&people[len].eip);
printf("\n\t\t国家:");
scanf("%s",&people[len].state);
len++;
printf("\n\t\t是否继续添加?(y/n):");
if (getch()=='y')
enter();
return;
}
void searchmenu()//查询菜单
{
char ch;
system("cls");
printf("\n\t\t************************************************");
printf("\n\t\t** 查询菜单 **");
printf("\n\t\t** 1--显示所有信息 **");
printf("\n\t\t** 2--按姓名查询 **");
printf("\n\t\t** 3--返回主菜单 **");
printf("\n\t\t************************************************");
printf(" \n\t\t 请选择:");
printf("%c",ch=getch());
switch (ch)
{
case '1':display();break;
case '2':search();break;
case '3':mainmenu();break;
}
}
void search()
{
printf("\n\t\t***************** 按姓名查找 *******************");
char name[20];
printf("\n\t\t请输入姓名:");
scanf("%s",name);
printf(" 查询到的信息:\n");
printf(" %-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");//格式控制输出
printf(" -----------------------------------------------------------------------------\n");
for (int i=0;i<len;i++)
{
if(strcmp(name,people[i].name)==0)//如果people[i].name和name相同?
printf(" %-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state);
// if (i+1<len) continue;//重名纪录再检索
}
printf(" -----------------------------------------------------------------------------\n");
printf("\n\t\t按任意键返回查询菜单");
getch();
searchmenu();
}
void display()//显示所有纪录
{
int i;
system("cls"); //执行控制台命令‘清屏’,就是cmd下的cls,清除所有显示信息
if(len!=0)
{
printf("\n\t\t*************** 以下为通讯录所有信息************\n\n");
printf(" %-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");
printf(" -----------------------------------------------------------------------------\n");
for (i=0;i<len;i++)
{
printf(" %-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state);
if (i+1<len) continue;
}
printf(" -----------------------------------------------------------------------------\n");
}
else
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回查询菜单:");
getch();
searchmenu();
}
void del() //删除纪录
{
int a=0,i,j,findmark; //findmark为查找结果标志
//int findmark=0,delmark=0;
char name[20];
printf("\n\t\t请输入要删除学生姓名:");
scanf("%s",name);
for (i=a;i<len;i++)
{
if (findmark=strcmp(people[i].name,name)==0) //找到一条符合条件的记录
{
//findmark++;
printf("\n\t\t以下是您找到的一条符合记录:\n");
printf(" %-18s%-18s%-18s%-15s%s\n","姓名","街道","城市","邮编","国家");
printf(" -----------------------------------------------------------------------------\n");
printf(" %-18s%-18s%-18s%-15s%s\n",people[i].name,people[i].street,people[i].city,people[i].eip,people[i].state); printf(" -----------------------------------------------------------------------------\n");
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j<len-1;j++)
people[j]=people[j+1];
len--;
i--;
//delmark++;
printf("\n\t\t删除成功");
if((i+1)<len)
{
printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)"); //是否删除同名纪录
if (getch()=='y')
{
a=i;
continue; //删除上一条记录之后搜索是否有同名纪录
}
}
} //endif
if((i+1)<len)
{
printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)"); //不删前一条纪录,删当前纪录
if (getch()=='y')
{
a=i;
continue;
}
}
} //endif
else
continue;
} //endfor
if(!findmark)//没有找到任何符合条件的记录
printf("\n\t\t没有符合条件的记录!");
printf("\n\t\t是否继续删除?(y/n)"); //无同名纪录,是否继续删除其他纪录
if (getch()=='y')
del(); //继续删除其他纪录
save();
}
void save()//写入文件
{
int i;
if ((fp=fopen("通讯录信息.txt","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<len;i++)
{
if (fwrite(&people[i],sizeof(struct record),1,fp)!=1)
printf("\n\t\t写入文件错误!\n");
}
fclose(fp); //关闭文件指针
printf("\n\t\t\t\t通讯录文件已保存\n\t\t\t\t按任意键继续...");
getch();
return;
}