#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 100
struct contact_type
{
char name[10];
char hometown[10];
long number[2];
char mail[10];
}cont[LEN];
void show();
void chon(int n,FILE *fp,struct contact_type *p)//重新写入
{
FILE *fp1;
int i=0;
fp=fopen("con.dat", "r+");
fp1=fopen("linshi.dat", "w+");//读写新建一个临时文件
for(i=0;i<n;i++)
{
fprintf(fp1,"%s%s%ld%ld%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
}
fclose(fp);
fclose(fp1);
remove("con.dat");
rename("linshi.dat", "con.dat");
}
void revise(int n,struct contact_type *p,FILE *fp)//文件修改
{
int i=0,j=0;
char c[10];
printf("请输入想要修改的对象:\n");
scanf("%s",&c);
for(i=0;i<n;i++)
{
if(strcmp(c,(p+i)->name)==0)
{
j=i;
printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
break;
}
}
printf("请输入修改后的信息\n");
scanf("%s%s%ld%ld%s",&(p+j)->name,&(p+j)->hometown,&(p+j)->number[0],&(p+j)->number[1],&(p+j)->mail);
printf("%s\n",c);
printf("%d\n",j);
if(fwrite(&p[j],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
chon(n,fp,p);
}
void save()//文件输入
{
int i=0;
FILE *fp;
if((fp=fopen("con.dat","web"))==NULL)
{
printf("can not open file\n");
return ;
}
for(i=0;i<LEN;i++)
if(fwrite(&cont[i],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int creat(int i,struct contact_type cont[LEN])//文件输入
{
char c;
printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
do
{
scanf("%s%s%ld%ld%s",&cont[i].name,&cont[i].hometown,&cont[i].number[0],&cont[i].number[1],&cont[i].mail);
i=i+1;
}
while(c=getchar()!='!');
fflush(stdin);//清除键盘缓冲区
save();
return (i);
}
int main()
{
FILE *fp;
int i=0,n=0,m=0;
struct contact_type *p;
p=cont;
n=creat(i,cont)-1;
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}
revise(n,p,fp);
fclose(fp);
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}
return 0;
}
修改完善如下,具体见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100
struct contact_type
{
char name[10];
char hometown[10];
long number[2];
char mail[10];
}cont[LEN];
//void show();
void chon(int n, FILE* fp, struct contact_type* p)//重新写入
{
FILE* fp1;
int i = 0;
//fp = fopen("conn.dat", "r+"); // fopen("con.dat", "r+")
fp1 = fopen("linshi.dat", "w+");//读写新建一个临时文件
for (i = 0; i < n; i++)
{
fwrite(p + i, sizeof(struct contact_type), 1, fp);
//fprintf(fp1, "%s%s%ld%ld%s\n", (p + i)->name, (p + i)->hometown,
// (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
}
//fclose(fp);
fclose(fp1);
remove("conn.dat"); //remove("con.dat");
rename("linshi.dat", "conn.dat");
}
void revise(int n, struct contact_type* p, FILE* fp)//文件修改
{
int i = 0, j = -1;
char c[10];
printf("请输入想要修改的对象姓名:\n");
scanf("%s", c);
//scanf("%s", &c);
for (i = 0; i < n; i++)
{
if (strcmp(c, (p + i)->name) == 0)
{
j = i;
printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",
(p + i)->name, (p + i)->hometown, (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
break;
}
}
if (j != -1 && j < n) {
printf("请输入修改的信息(姓名 籍贯 电话号码1 电话号码2 电子邮箱):\n");
scanf("%s%s%ld%ld%s", (p + j)->name, (p + j)->hometown,
&(p + j)->number[0], &(p + j)->number[1], (p + j)->mail);
//scanf("%s%s%ld%ld%s", &(p + j)->name, &(p + j)->hometown,
//&(p + j)->number[0], &(p + j)->number[1], &(p + j)->mail);
printf("%s\n", c);
printf("%d\n", j);
//if (fwrite(&p[j], sizeof(struct contact_type), 1, fp) != 1)
// printf("file write error\n");
//fclose(fp);
chon(n, fp, p);
}
else
printf("未找到相关记录!\n");
}
void save(int n)//文件输入
{
int i = 0;
FILE* fp;
if ((fp = fopen("conn.dat", "wb")) == NULL)
//if ((fp = fopen("con.dat", "web")) == NULL)
//DOS保留字,表示屏幕。如con 1.txt con就是把1.txt的内容显示在屏幕上。
//(注意不能用con做文件名)
{
printf("can not open file\n");
return;
}
for (i = 0; i < n; i++) { //for (i = 0; i < LEN; i++)
if (fwrite(&cont[i], sizeof(struct contact_type), 1, fp) != 1)
printf("file write error\n");
}
fclose(fp);
}
int creat(int i, struct contact_type cont[])//文件输入
{
char c[10];
printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
while(1) //do
{
scanf("%s", c);
if (strcmp(c, "!") == 0) break;
strcpy(cont[i].name, c);
scanf("%s%ld%ld%s", cont[i].hometown, &cont[i].number[0], &cont[i].number[1], cont[i].mail);
//scanf("%s%s%ld%ld%s", &cont[i].name, &cont[i].hometown, &cont[i].number[0], &cont[i].number[1], &cont[i].mail);
i = i + 1;
} //while (c = getchar() != '!');
//fflush(stdin);//清除键盘缓冲区
save(i);
return (i);
}
int main()
{
FILE* fp;
int i = 0, n = 0, m = 0;
struct contact_type* p;
p = cont;
n = creat(i, cont); //n = creat(i, cont) - 1;
if ((fp = fopen("conn.dat", "rb")) == NULL)
//fp = fopen("con.dat", "rb") 不能用con做文件名
{
printf("can not open file\n");
exit(0);
}
for (i = 0; i < n; i++)
{
fread(&cont[i], sizeof(struct contact_type), 1, fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", cont[i].name,
cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
}
fclose(fp);
revise(n, p, fp);
if ((fp = fopen("conn.dat", "rb")) == NULL)
//fp = fopen("con.dat", "rb")
{
printf("can not open file\n");
exit(0);
}
for (i = 0; i < n; i++)
{
fread(&cont[i], sizeof(struct contact_type), 1, fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",
cont[i].name, cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
}
return 0;
}
中间有这么两行:
fclose(fp);
chon(n,fp,p);
我具体没测试过, fp被关闭后,还能否被调用