新手关于C语言的问题求大神解答啊
#include "stdio.h"
#include "stdlib.h"
#include "process.h"
#include "string.h"
static int n;
struct friends_list
{
char name[15];
char sex[10];
char tel_num[20];
char adress_list[30];
}info[100];
void Introduction();
void Save();
void Show();
void Search(char name[]);
void Modify(char name[]);
void Delete(char name[]);
void Copy(char filename);
void introduction()
{
printf(" Quickly Save \n");
printf("**** 这是一个能快速的存放亲朋好友信息的程序****\n");
printf("**** 它具有以下功能:\n");
printf("**** 1:录入好友的姓名、性别、电话号码、地址并保存记录\n");
printf("**** 2:显示好友信息的列表\n");
printf("**** 3:实现快速查找某个好友的各类信息\n");
printf("**** 4:修改某个好友的信息\n");
printf("**** 5:实现删除某个成员的信息\n");
printf("**** 6:给通讯录备份一下\n");
printf("**** 7:退出该程序\n");
printf("***************************************copyright by Lansing\n");
}
void Save()
{
FILE *fp;
int i;
if((fp=fopen("E:exp09.txt","wb"))==NULL)
{
printf("can not be opened!\n");
exit(0);
}
for(i=0;i<n;i++)
{
if(fwrite(&info[i],sizeof(struct friends_list),1,fp)!=1)
printf("\nFile write error");
fprintf(fp,"\r\n");
}
fclose(fp);
}
void Show()
{
FILE *fp;
int i;
if((fp=fopen("E:exp09.txt","rb"))==NULL)
{
printf("can not open the file!\n");
exit(0);
}
printf(" Name Sex Tel_name Adress \n");
for(i=0;i<n;i++)
{
if(fread(&info[i],sizeof(struct friends_list),1,fp)!=1)
{
if(feof(fp))return;
printf("\nFile read error");
}
printf("%4s%10s%10s%15s\n",info[i].name,info[i].sex,info[i].tel_num,info[i].adress_list);
}
fclose(fp);
}
void Copy(char filename)
{
FILE *fp1,*fp2;
int i;
char c;
if((fp1=fopen("E:exp09.txt","rb"))==NULL)
{
printf("can not be opened!\n");
exit(0);
}
if((fp2=fopen(filename,"wb"))==NULL)
{
printf("can not be opened!\n");
exit(0);
}
c=fgetc(fp1);
while(c!=EOF)
{
fputc(c,fp2);
fgetc(fp1);
}
fclose(fp1,fp2);
}
main()
{
int i,choice;
char name[15],filename[20];
introduction();
a:printf("Please input your choice(1~7):");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入要录入的人数:");
scanf("%d",&n);
printf("请输入好友的信息:\n");
printf(" Name Sex Tel_name Adress\n");
for(i=0;i<n;i++)
{
scanf("%s%s%s%s",&info[i].name,&info[i].sex,&info[i].tel_num,&info[i].adress_list);
printf("------------------------------------\n");
}
Save();
break;
}
case 2:
{
Show();
break;
}
case 3:
{
printf("请输入要查找的人名:\n:");
scanf("%s",&name);
Search(name);
break;
}
case 4:
{
printf("请输入要修改的人名:\n");
scanf("%s",&name);
Modify(name);
break;
}
case 5:
{
printf("请输入要删除的人名:\n");
scanf("%s",&name);
Delete(name);
break;
}
case 6:
{
printf("请输入要备份的位置:\n");
scanf("%s",&filename);
Copy(filename);
break;
}
case 7:
{
exit(0);
}
default:printf("Input error!\n");break;
}
goto a;
}
那个Show()函数写错了没啊,为什么运行的时候它只能显示 一个人的信息 还有下个人的名字 其他都显示不了,求解释。。。
[解决办法]
- C/C++ code
oid Save(){ FILE *fp; int i; if((fp=fopen("E:exp09.txt","wb"))==NULL) { printf("can not be opened!\n"); exit(0); } for(i=0;i<n;i++) { if(fwrite(&info[i],sizeof(struct friends_list),1,fp)!=1) printf("\nFile write error"); //fprintf(fp,"\r\n");//此处不需要,如果要加上回车待会读文件的时候要将回车长度计算进去 } fclose(fp);}void Show(){ FILE *fp; int i; if((fp=fopen("E:exp09.txt","rb"))==NULL) { printf("can not open the file!\n"); exit(0); } printf(" Name Sex Tel_name Adress \n"); for(i=0;i<n;i++) { if(fread(&info[i],sizeof(struct friends_list),1,fp)!=1)//这里默认两个结构体之间是连续的,但是实际上在保存的时候加了回车换行,所以这里导致出错,将保存时的回车换行去掉即可。 { if(feof(fp))return; printf("\nFile read error"); } printf("%4s%10s%10s%15s\n",info[i].name,info[i].sex,info[i].tel_num,info[i].adress_list); } fclose(fp);}void Copy(char *filename)//参数错误,应该为char*fclose(fp1, fp2);//没有用过,我一直用fclose(fp1);fclose(fp2),你这个编译没通过。
[解决办法]
scanf("%s%s%s%s",&info[i].name,&info[i].sex,&info[i].tel_num,&info[i].adress_list);
scanf("%s",&name);
scanf("%s",&filename);
把scanf中的&操作符都去掉,因为你定义的这些变量都是数组,本身就是地址。详细看一下scanf();的参数说明;
建议你不要使用goto语句,在你实现的功能了里,完全没必要使用goto语句。
[解决办法]
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。