请问怎么正确读和写信息到.txt文件中?

ztwz 2004-07-20 10:34:12
这是我写的一个电话薄,但是问题很多,现在能正确编译,但是里面的功能一个都不能正确实现!
在这个程序的同目录下有一个data.txt文本,里面的内容如下:
*
wz
1
yn
*
wy
2
yn
#
我选1的时候不能正确显示电话号码也就是文本里的1和2!其它几个功能也都不能实现,我觉得我的子函数没写错呀,就是不知道哪儿错了,总是感觉好像和主函数连接不太好,但又不知道要怎么修改!请大虾们帮我看看。
#include "stdio.h"
#include "stdlib.h"
int i;
typedef struct phone
{
char name[20];
int phones[20];
char address[40];
struct phone *next;
}phone_info;

f_show(phone_info *ph)
{
phone_info *p;
p=ph->next;
if(p==NULL)
{
printf("数据库为空!\n");
return;
}
while(p)
{
printf("\n名字:%s",p->name);
printf("\n电话:%d",p->phones);
printf("\n地址:%s",p->address);
p=p->next;
}
getch();
}



f_add(phone_info *ph) /*添加信息*/
{
phone_info *p;
p=(phone_info *)malloc(sizeof(phone_info));
printf("请输入要添加入的信息!\n");
printf("名字:");
scanf("%s",&p->name);
printf("\n电话:");
scanf("%ld",&p->phones);
printf("\n地址:");
scanf("%s",&p->address);
if(ph->next==NULL)
{
p->next=ph->next;
ph->next=p;
}
p->next=ph->next;
ph->next=p;
}




f_del(phone_info *ph)
{
phone_info *p,*q;
char name[20];
p=q=ph->next;
printf("请输入要删除人的名字:");
scanf("%s",name);
if(strcmp(name,p->name)==0)
{
ph->next=p->next;
printf("数据删除成功!\n");
getch();
return;
}
while(p->next!=NULL)
{
p=p->next;
if(strcmp(name,p->name)==0)
{
q->next=p->next;
p=p->next;
printf("数据删除成功!\n");
getch();
}
q=p;
}
if((strcmp(name,p->name)==0)&&(p->next==NULL))
{
q=p->next;
p=q;
printf("数据删除成功!\n");
getch();
return;
}
else
{
printf("查无此人\n");
return;
}
}




f_menu(phone_info *p)
{
char menu;
clrscr();
printf("\t************************************************************\n");
printf("\t***** 1--显示所有记录 *****\n");
printf("\t***** 2--添加一条记录 *****\n");
printf("\t***** 3--删除一条记录 *****\n");
printf("\t***** 4--保存 *****\n");
printf("\t***** 5--退出程序 *****\n");
printf("\t************************************************************\n");
printf("\t请输入数字(1-5):");
scanf("%c",&menu);

switch(menu)
{
case '1' : f_show(p); break;
case '2' : f_add(p); break;
case '3' : f_del(p); break;
case '4' : f_seve(p); break;
case '5' : exit(1); break;
default :
{
printf("输入错误!\n");
printf("按任意键退出!...");
getch();
}
}
}


f_all_file(phone_info *ph)
{
FILE *fp;
phone_info *p,*q;
char ch;
i=0;
q=ph;
fp=fopen("data.txt", "rt");
if(fp==NULL)
{
printf("打开数据库失败!\n按任意键退出!");
getch();
exit(1);
}
ch=fgetc(fp);
while(ch!='#')
{
p=(phone_info *)malloc(sizeof(phone_info));
fscanf(fp,"%s\n%d\n%s\n",&p->name,&p->phones,&p->address);
q->next=p;
i++;
q=p;
ch=fgetc(fp);
}
if(i==0)
{
printf("数据库为空!\n");
getch();
return;
}
else
{
q->next=NULL;
printf("共有 %d 信息!\n",i);
getch();
return;
}
}


f_seve(phone_info *ph)
{
phone_info *p;
FILE *fp;
p=ph->next;
fp=fopen("data.txt","wt");
if(fp==NULL)
{
printf("数据库为空\n");
fputc('#',fp);
fclose(fp);
getch();
return;
}
printf("请等待.........\n");
while(p)
{
/*fputc('*',fp);*/
fprintf(fp,"%s\n%ld\n%s\n",p->name,p->phones,p->address);
p=p->next;
}
fputc('#',fp);
fclose(fp);
printf("保存成功!\n");
getch();
}



main()
{
phone_info *p;
p=(phone_info *)malloc(sizeof(phone_info));
f_all_file(p);
f_menu(p);
free(p);
getch();
}




...全文
242 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nobush 2004-07-21
  • 打赏
  • 举报
回复
在f_show()中加一个变量计数 while(p)每循环一次加1,当加到10的倍数时,暂停一下,

如果要上下翻页,建议使用数组。
ztwz 2004-07-21
  • 打赏
  • 举报
回复
谢谢楼上的几位,下面是我改过的程序,基本功能都能实现了!还是还有一个小问题就是当电话薄里面的人很多时,一个屏幕不能显示完,要怎么用上下箭头进行翻页?

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"


int i;


typedef struct phone
{
char name[20];
char phones[30];
char address[40];
struct phone *next;
}phone_info;


f_show(phone_info *ph)
{
phone_info *p;
p=ph->next;
if(p==NULL)
{
printf("数据库为空!\n");
return;
}
while(p)
{
printf("\n名字:%s",p->name);
printf("\n电话:%s",p->phones);
printf("\n地址:%s",p->address);
printf("\n---------------------------------------------------------");
p=p->next;
}
getch();
}



f_add(phone_info *ph) /*添加信息*/
{
phone_info *p;
p=(phone_info *)malloc(sizeof(phone_info));
printf("请输入要添加入的信息!\n");
printf("\n名字:");
scanf("%s",&p->name);
printf("\n电话:");
scanf("%s",&p->phones);
printf("\n地址:");
scanf("%s",&p->address);
if(ph->next==NULL)
{
p->next=ph->next;
ph->next=p;
}
p->next=ph->next;
ph->next=p;
}




f_del(phone_info *ph)
{
phone_info *p,*q;
char name[20];
p=q=ph->next;
printf("请输入要删除人的名字:");
scanf("%s",name);
if(strcmp(name,p->name)==0)
{
ph->next=p->next;
printf("数据删除成功!\n");
getch();
return;
}
while(p->next!=NULL)
{
p=p->next;
if(strcmp(name,p->name)==0)
{
q->next=p->next;
p=p->next;
printf("数据删除成功!\n");
getch();
}
q=p;
}
if((strcmp(name,p->name)==0)&&(p->next==NULL))
{
q=p->next;
p=q;
printf("数据删除成功!\n");
getch();
return;
}
else
{
printf("查无此人\n");
return;
}
}




f_menu(phone_info *p)
{
int menu;
clrscr();
printf("\t************************************************************\n");
printf("\t***** 1--显示所有记录 *****\n");
printf("\t***** 2--添加一条记录 *****\n");
printf("\t***** 3--删除一条记录 *****\n");
printf("\t***** 4--保存 *****\n");
printf("\t***** 5--退出程序 *****\n");
printf("\t************************************************************\n");
printf("\t请输入数字(1-5):");
scanf("%d",&menu);

switch(menu)
{
case 1 : f_show(p); break;
case 2 : f_add(p); break;
case 3 : f_del(p); break;
case 4 : f_seve(p); break;
case 5 : exit(1); break;
default :
{
printf("输入错误!\n");
printf("按任意键退出!...\n");
}
}
}


f_all_file(phone_info *ph)
{
FILE *fp;
phone_info *p,*q;
char ch,c;
i=0;
q=ph;
fp=fopen("data.txt", "rt");
if(fp==NULL)
{
printf("打开数据库失败!\n按任意键退出!");
getch();
exit(1);
}
ch=fgetc(fp);
while(ch!='#')
{
p=(phone_info *)malloc(sizeof(phone_info));
fscanf(fp,"%c\n%s\n%s\n%s\n",&c,&p->name,&p->phones,&p->address);
q->next=p;
i++;
q=p;
ch=fgetc(fp);
}
if(i==0)
{
printf("数据库为空!\n");
getch();
return;
}
else
{
q->next=NULL;
printf("共有 %d 信息!\n",i);
getch();
return;
}
}


f_seve(phone_info *ph)
{
phone_info *p;
FILE *fp;
char ch;
p=ph->next;
fp=fopen("data.txt","wt");
if(fp==NULL)
{
printf("数据库为空\n");
fputc('#',fp);
fclose(fp);
getch();
return;
}
printf("请等待.........\n");
while(p)
{
fputc('*',fp);
fprintf(fp,"%c\n%s\n%s\n%s\n",ch,p->name,p->phones,p->address);
p=p->next;
}
fputc('#',fp);
fclose(fp);
printf("保存成功!\n");
getch();
}



main()
{
phone_info *p;
p=(phone_info *)malloc(sizeof(phone_info));
f_all_file(p);
while(1)
{
f_menu(p);
}
free(p);
getch();
}
Asan13 2004-07-21
  • 打赏
  • 举报
回复
int phones[20];
这个改成char phones[20];
定义成数组不是很好。而且fscanf(fp,"%s\n%d\n%s\n",&p->name,&p->phones,&p->address);
不对。关于输入输出的格式再好好看一下。
觉得错误还不少,小生水平一般,在努力地看和改。可能没法那么快搞定。
expert2000 2004-07-21
  • 打赏
  • 举报
回复
学习,帮顶,楼主给点分我就能提高。^!^
zbstone 2004-07-20
  • 打赏
  • 举报
回复
指针是FILE,类型的文件指针
使用前先打开文件
zbstone 2004-07-20
  • 打赏
  • 举报
回复
printf(指针,);
后面的格式跟PRINT一样

70,023

社区成员

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

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