怎样让两个文件相互匹配?

onlyou4 2008-09-06 09:42:01
准备用C编写一个手机充值管理系统,想用一个文件存放所有的客户信息(存放客户的姓名和手机号码),然后每个客户都有一个与之相对应的充值历史记录文件。我想问的是,在第一个文件中找到一个客户信息后,有没有办法能自动打开他的充值历史记录文件,对其数据进行调用?

谢谢好心人的帮忙!
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mars_man 2008-09-16
  • 打赏
  • 举报
回复
是否是因为你输入的是:
Please input number: 15998481234
Please input address: d:\\mobile\\LiLin.dat
Do want to charge, Y or N ?

如果换成这样呢:
Please input number: 15998481234
Please input address: d:\mobile\LiLin.dat
Do want to charge, Y or N ?

我手头没有编译器,还没有试。
yangkunhenry 2008-09-07
  • 打赏
  • 举报
回复
mark
onlyou4 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 CSYNYK 的回复:]
估计是你实际的文件名和字符串不对应!
[/Quote]

感激CSYNYK!由于是新号所以没有分,以后我会补上。

回去在保证文件名和字符串相对应的情况下试了试,但还是不行:

这是运行的结果:

Please input the name:LiLin
This name isn't exist
Do you want to save this new name, Y or N ?
Y
Please input name: LiLin
Please input number: 15998481234
Please input address: d:\\mobile\\LiLin.dat
Do want to charge, Y or N ?
Y

当输入"Y"后程序就卡住了…… =。=

只有把整个程序贴上了(请在运行前在D盘创建一个名为mobile的文件夹):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct His
{
float money;
char payment;
char pay_success;
float cost;
}History;

typedef struct Cus
{
char name[20];
char number[18];
char address[50];
}Customer;

void CreateFileC() /*创建存储客户姓名和号码的文件*/
{
FILE *fp;
Customer C;

if((fp=fopen("D:\\mobile\\Customer.dat","wb+"))==NULL)
{printf("no room to save data!"); exit(0);}

fflush(stdin);
printf("Please input name: ");
scanf("%s",C.name);
printf("Please input number: ");
scanf("%s",C.number);
fflush(stdin);
printf("Please input address: ");
scanf("%s",C.address);

fwrite(&C,sizeof(Customer),1,fp);
fclose(fp);
}

void CreateFileH(char *p) /*创建客户所对应的充值记录文件*/
{
FILE *fp;
History H;
char address[50];

strcpy(address,p);
printf("%s",address);

if((fp=fopen(address,"ab"))==NULL) /*"address"换成"p"也运行不了*/
{printf("no room to save data!"); exit(0);}

printf("How much money do you want to charge?\n");
scanf("%f",&H.money);

fflush(stdin);
printf("Have you received money, Y or N ? ");
scanf("%c",&H.payment);

fflush(stdin);
printf("Is charge successful, S or F ? ");
scanf("%c",&H.pay_success);

fwrite(&H,sizeof(History),1,fp);
fclose(fp);
}

void is_charge(char *p) /*判断是否记录用户充值记录*/
{
char choice;

printf("Do want to charge, Y or N ?\n");
fflush(stdin);
scanf("%c",&choice);

if(choice=='Y')
{
CreateFileH(p);
printf("Input any button to return:");
getch();
return;
}

else if(choice=='N')
{
printf("Press any button to return:");
getch();
return;
}
}

void Search_customer()
{
FILE *fp;
int flag=0;
char choice;
char Name[20];
Customer C;
char add[50];

fp=fopen("D:\\mobile\\Customer.dat","rb");

if(fp==NULL) /*第一次运行提示是否创建文件*/
{
printf("No file. Now creat a new file\n");
CreateFileC();

fread(&C,sizeof(Customer),1,fp);

is_charge(C.address);
}

else
{
printf("Please input the name:");
scanf("%s",Name);

while(!feof(fp)) /*在文件中查找客户信息*/
{
fflush(stdin);
fread(&C,sizeof(Customer),1,fp);
if(strcmp(C.name,Name)==0)
{
printf("%s ",C.name);
printf("%s\n",C.number);
printf("%s\n",C.address);
flag=1;

strcpy(add,C.address);
is_charge(add);
break;
}
}

if(flag==0) /*如果没找到,提示是否存储该客户信息*/
{
printf("This name isn't exist\n");

printf("Do you want to save this new name, Y or N ?\n");
fflush(stdin);
scanf("%c",&choice);

if(choice=='Y')
{
CreateFileC();

fread(&C,sizeof(Customer),1,fp);
is_charge(C.address);
}

else
if(choice=='N')
{
printf("Thank you\n");
return;
}
}
}
}

main()
{


Search_customer();

getch();
}

大家帮忙看一下,是哪里出错了? 由于是新号所以没有分数,以后补上。小弟不甚感激!
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
估计是你实际的文件名和字符串不对应!
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
编译了一下,除了char address[50]; 后面的分号的形式不对意外别的没什么问题,写入文件也成功了!
_石头_ 2008-09-07
  • 打赏
  • 举报
回复
代码没看出什么问题阿!
onlyou4 2008-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 CSYNYK 的回复:]
那就定义一个结构体嘛!譬如:
typedef struct _UserInfo
{
char name[20];
char movnum[20];
char filename[20];
}USINF;
[/Quote]

谢谢CSYNYK 的解答!

我也是定义了这样的一个结构体
typedef struct Cus
{
char name[20];
char number[18];
char address[50];
}Customer;
第一个文件按这个结构体存储了用户的姓名号码,最后一个address[50]我采用了键盘输入存储的地址,比如"d:\\a.dat"

存储客户历史记录的文件的定义如下:
typedef struct His
{
float money;
char payment;
char pay_success;
float cost;
}History;

程序的大体我已经编写好了,但程序运行到创建充值历史的文件时出了问题。

这是创建第二个文件的函数
void CreateFileH(char *p) //从第一个文件中读取的地址复制到一个字符数组中,再用p指向这个数组
{
FILE *fp;
History H;
char address[50];

strcpy(address,p);
printf("%s",address); //打印出的地址是完整的

if((fp=fopen(p,"ab"))==NULL) //但程序运行到这里就卡住了,换成address也不能运行,如果将p直接换成"d:\\a.dat"又可运行。
{printf("no room to save data!"); exit(0);}

printf("How much money do you want to charge?\n");
scanf("%f",&H.money);

fflush(stdin);
printf("Have you received money, Y or N ? ");
scanf("%c",&H.payment);

fflush(stdin);
printf("Is charge successful, S or F ? ");
scanf("%c",&H.pay_success);

fwrite(&H,sizeof(History),1,fp);
fclose(fp);
}
_石头_ 2008-09-06
  • 打赏
  • 举报
回复
那就定义一个结构体嘛!譬如:
typedef struct _UserInfo
{
char name[20];
char movnum[20];
char filename[20];
}USINF;

70,006

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧