C语言通讯录怎么保存文件并且再次打开时能显示储存的数据?
add(){inti,num;charstr[10];if((fp=fopen("student.bin","wb+"))==NULL){printf("\n\t\t文件...
add()
{
int i,num;
char str[10];
if ((fp=fopen("student.bin","wb+"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<num;i++)
{
if (fwrite(&student[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
printf("\n\t\t**************** 请输入联系人信息 ****************\n");
printf("\n\t\t输入姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t输入电话号码:");
scanf("%s",&student[num].phone);
printf("\n\t\t输入地址:");
scanf("%s",&student[num].adress);
printf("\n\t\t输入邮编:");
scanf("%s",&student[num].postcode);
printf("\n\t\t输入e-mail:");
scanf("%s",&student[num].e_mail);
num++;
printf("\n\t\t是否继续添加?(请输入y(是)或n(否):");
if (getch()=='y')
adduser();
return(0);
}
fclose(fp);
printf("\n\t\t通讯录文件已保存");
printf("\n\t\t按任意键退出程序\n\t\t");
exit(0);
return(0);
}
这是保存文件那部分的代码,请各位大神求助!! 展开
{
int i,num;
char str[10];
if ((fp=fopen("student.bin","wb+"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<num;i++)
{
if (fwrite(&student[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
printf("\n\t\t**************** 请输入联系人信息 ****************\n");
printf("\n\t\t输入姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t输入电话号码:");
scanf("%s",&student[num].phone);
printf("\n\t\t输入地址:");
scanf("%s",&student[num].adress);
printf("\n\t\t输入邮编:");
scanf("%s",&student[num].postcode);
printf("\n\t\t输入e-mail:");
scanf("%s",&student[num].e_mail);
num++;
printf("\n\t\t是否继续添加?(请输入y(是)或n(否):");
if (getch()=='y')
adduser();
return(0);
}
fclose(fp);
printf("\n\t\t通讯录文件已保存");
printf("\n\t\t按任意键退出程序\n\t\t");
exit(0);
return(0);
}
这是保存文件那部分的代码,请各位大神求助!! 展开
1个回答
展开全部
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 0
// thu 1004: $4.50 0
// fri 1005: $5.60 0
// 请输入查询卡号: 1003
// 测试---开始
// wed 1003: $3.40 1
// 测试---结果
//
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 1
// thu 1004: $4.50 0
// fri 1005: $5.60 0
#include
#include
#include
struct arm
{
char name[11];
char num_car[11];
float value;
int state;
};
struct arm num[100]; //暂时没有用到
void loss_card(void)
{
struct arm oneItem;
char infor[11];
//原代码int a;
int ret; //函数fread()的返回值
int size = sizeof(struct arm);
FILE *pcard;
//原代码if ((pcard = fopen("book.dat", "a+b")) == NULL)
// rb+ 读写打开一个二进制文件,允许读写数据(可以任意修改),文件必须存在.
if ((pcard = fopen("book.dat", "rb+")) == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
//原代码while (getchar() != '\n');
//原代码printf("请输入查询卡号:\n");
//原代码s_gets(infor, 11);
printf("请输入查询卡号:");
fflush(stdin); //清空输入缓存,吸收掉回车符(有的编译器不适用)
gets(infor);
printf("测试---开始\n");
//原代码for (a = 0; fread(&num[a], size, 1, pcard); a++)
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
if (strncmp(infor, oneItem.num_car, 10) == 0)
{
if(oneItem.state == 0)
{
oneItem.state = 1;
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
else
{
printf("该账户已挂失。");
}
//把文件指针移动到离文件当前位置的-size的地方,也就是退回1个size
//常数SEEK_CUR表示当前位置
fseek(pcard,-size,SEEK_CUR);
fwrite(&oneItem, size, 1, pcard); //写入新数据
//只需找到一个,写入新数据后就退出,如果继续循环,会异常
break;
}
}
}
//原代码fwrite(&num[a], size, 1, pcard);
printf("测试---结束\n");
fclose(pcard);
}
void testWrite() //测试:写入文件
{
struct arm test[5]={{"mon","1001",1.2,0},{"tue","1002",2.3,0},
{"wed","1003",3.4,0},{"thu","1004",4.5,0},
{"fri","1005",5.6,0}};
FILE *pcard;
int size = sizeof(struct arm);
int a;
// wb 只写打开或建立一个二进制文件,只允许写数据
pcard = fopen("book.dat", "wb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
for(a=0;a<5;a++)
{
fwrite(&test[a], size, 1, pcard);
}
fclose(pcard);
}
void testRead() //测试:读取文件
{
struct arm oneItem;
FILE *pcard;
int size = sizeof(struct arm);
int ret;
// rb 只读打开一个二进制文件,只允许读数据
pcard = fopen("book.dat", "rb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
printf("\n显示文件的数据:\n");
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
}
fclose(pcard);
}
int main()
{
testWrite(); //测试:写入文件
testRead(); //测试:读取文件
loss_card();
testRead(); //测试:读取文件
return 0;
}
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 0
// thu 1004: $4.50 0
// fri 1005: $5.60 0
// 请输入查询卡号: 1003
// 测试---开始
// wed 1003: $3.40 1
// 测试---结果
//
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 1
// thu 1004: $4.50 0
// fri 1005: $5.60 0
#include
#include
#include
struct arm
{
char name[11];
char num_car[11];
float value;
int state;
};
struct arm num[100]; //暂时没有用到
void loss_card(void)
{
struct arm oneItem;
char infor[11];
//原代码int a;
int ret; //函数fread()的返回值
int size = sizeof(struct arm);
FILE *pcard;
//原代码if ((pcard = fopen("book.dat", "a+b")) == NULL)
// rb+ 读写打开一个二进制文件,允许读写数据(可以任意修改),文件必须存在.
if ((pcard = fopen("book.dat", "rb+")) == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
//原代码while (getchar() != '\n');
//原代码printf("请输入查询卡号:\n");
//原代码s_gets(infor, 11);
printf("请输入查询卡号:");
fflush(stdin); //清空输入缓存,吸收掉回车符(有的编译器不适用)
gets(infor);
printf("测试---开始\n");
//原代码for (a = 0; fread(&num[a], size, 1, pcard); a++)
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
if (strncmp(infor, oneItem.num_car, 10) == 0)
{
if(oneItem.state == 0)
{
oneItem.state = 1;
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
else
{
printf("该账户已挂失。");
}
//把文件指针移动到离文件当前位置的-size的地方,也就是退回1个size
//常数SEEK_CUR表示当前位置
fseek(pcard,-size,SEEK_CUR);
fwrite(&oneItem, size, 1, pcard); //写入新数据
//只需找到一个,写入新数据后就退出,如果继续循环,会异常
break;
}
}
}
//原代码fwrite(&num[a], size, 1, pcard);
printf("测试---结束\n");
fclose(pcard);
}
void testWrite() //测试:写入文件
{
struct arm test[5]={{"mon","1001",1.2,0},{"tue","1002",2.3,0},
{"wed","1003",3.4,0},{"thu","1004",4.5,0},
{"fri","1005",5.6,0}};
FILE *pcard;
int size = sizeof(struct arm);
int a;
// wb 只写打开或建立一个二进制文件,只允许写数据
pcard = fopen("book.dat", "wb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
for(a=0;a<5;a++)
{
fwrite(&test[a], size, 1, pcard);
}
fclose(pcard);
}
void testRead() //测试:读取文件
{
struct arm oneItem;
FILE *pcard;
int size = sizeof(struct arm);
int ret;
// rb 只读打开一个二进制文件,只允许读数据
pcard = fopen("book.dat", "rb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
printf("\n显示文件的数据:\n");
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
}
fclose(pcard);
}
int main()
{
testWrite(); //测试:写入文件
testRead(); //测试:读取文件
loss_card();
testRead(); //测试:读取文件
return 0;
}
追问
能解释一下怎么显示文件里的数据吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询