C写的通讯录,将数据写入文件时多了点东西,从文件读出时出错,求指教

kou753852951 2013-05-26 11:49:19

/*班级通讯录管理系统
以本班同学的具体数据为背景,设计实现一个本班同学通讯录管理系统,实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。

希望前辈们多多指导,多多提携,让小子在编程的这条路上走的更远,不胜感激!
如果前辈能提供一些您的小程序供我们学习,那最好不过,呵呵...
*/


#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50

typedef struct { //定义结构体
char name[20];
char address[20];
char tel[12];
char youbian[8];
char Email[32];
}Node;

typedef struct { //静态链表
Node *elem;
int length;
int listsize;
}Sqlist;

void InitSqlist(Sqlist *L){ //初始化
L->elem=(Node *)malloc(MaxSize*sizeof(Node));
if(!L->elem) exit(0);
L->length=0;
L->listsize=MaxSize;
}



void InsertElem(Sqlist *L){ //添加成员
Node *base;
int n;
n=L->length;
if(L->length>=L->listsize) {
base=(Node *)realloc(L->elem,(L->listsize+10)*sizeof(Node));
L->elem=base;
(L->listsize)+=10;
}

printf("please input %dth data: ",n+1);
printf("\n name : ");
scanf("%s",L->elem[n].name);
printf("\n address: ");
scanf("%s",L->elem[n].address);
printf("\n tel : ");
scanf("%s",L->elem[n].tel);
printf("\n youbian: ");
scanf("%s",L->elem[n].youbian);
printf("\n Email : ");
scanf("%s",L->elem[n].Email);
/*
printf("please input %dth data: ",n+1);
printf("\n name : ");
gets(L->elem[n].name); //如果只写一行 直接就跳过去了,为什么?
gets(L->elem[n].name);
printf("\n address: ");
gets(L->elem[n].address);
printf("\n tel : ");
gets(L->elem[n].tel);
printf("\n youbian: ");
gets(L->elem[n].youbian);
printf("\n Email : ");
gets(L->elem[n].Email);
*/
printf("\n");
L->length++;
}


void print(Sqlist *L,int n) //输出单个成员信息
{
printf("第%d个联系人资料:\n名字:",n+1);
puts(L->elem[n].name);
printf("\n地址:");
puts(L->elem[n].address);
printf("\n电话:");
puts(L->elem[n].tel);
printf("\n邮编:");
puts(L->elem[n].youbian);
printf("\n邮箱:");
puts(L->elem[n].Email);
printf("\n");
}

int xunzhao(Sqlist *L) //根据姓名查找成员的排序号
{
char q[20];
int i,n;
printf("输入姓名:");
scanf("%s",q);
for(i=0;i<L->length;i++)
{
n=0;
while(L->elem[i].name[n]==q[n])
{
n++;
if(n==strlen(q))
{
return i;
}
}
}
}
void output(Sqlist *L) //输出所有成员信息
{
int n=0;
while(n<L->length)
{
print(L,n);
n++;
printf("\n");
}
}

void DelElem(Sqlist *L)//根据成员姓名删除一个成员
{
Node *d,*q;
int i;

i=xunzhao(L);
printf("\n%d \n\n",i+1);
d=&(L->elem[i]);
q=L->elem+L->length-1 ;
for(++d;d<=q;++d)
{
strcpy((d-1)->name,d->name);
strcpy((d-1)->address,d->address);
strcpy((d-1)->Email,d->Email);
strcpy((d-1)->youbian,d->youbian);
strcpy((d-1)->tel,d->tel);
}
L->length--;
printf("\nOK \n\n");
}


void chazhao(Sqlist *L) //查找成员
{
int i;
i=xunzhao(L);
print(L,i);
}

void swap(char a[],char b[]) //交换 两个字符串
{
char q[30];
strcpy(&q[0],&a[0]);
strcpy(&a[0],&b[0]);
strcpy(&b[0],&q[0]);
}

void paixu(Sqlist *L) //对所有成员按姓名进行排序
{
int i,j,n;
for(i=0;i<L->length;i++)
for(j=i+1;j<L->length;j++)
{
if(strcmp(L->elem[i].name,L->elem[j].name)>0)
{
swap(L->elem[i].name,L->elem[j].name);
swap(L->elem[i].address,L->elem[j].address);
swap(L->elem[i].Email,L->elem[j].Email);
swap(L->elem[i].youbian,L->elem[j].youbian);
swap(L->elem[i].tel,L->elem[j].tel);
}
}
printf("\nOK \n\n");
}





void save(Sqlist *L) //保存至文件
{
FILE *fp;
int i;
if((fp=fopen("F:\\output.txt","w"))==NULL)
{
printf("can not open file\n");
return;
}
for(i=0;i<L->length;i++)
{
if(fwrite(&(L->elem[i]),sizeof(Node),1,fp)!=1)
printf("file write error,\n");
}
printf("\nok\n\n");
fclose(fp);
}

void writein(Sqlist *L) //由文件写入程序
{
FILE *fp;
int i,o=1;
if((fp=fopen("F:\\output.txt","r"))==NULL)
{
printf("can not open file\n");
return;
}
for(i=0;i<MaxSize;i++)
{
if(feof(fp)==1) break;
if(fread(&(L->elem[i]),sizeof(Node),1,fp)!=1)
{
o=0;
printf("file read error,\n");
break;
}
}
fclose(fp);
if(o!=0)
{
printf("\nok\n\n");
output(L);
}
}

main()
{
int j,x;
Sqlist L;
InitSqlist(&L);
while(1)
{
x=508;
do
{
if(x!=508) printf("\nInput wrong,please trying again.\n\n");
printf("请输入:\n1:插入\n2:删除\n3:查找\n4:排序\n5:输出\n6:将通讯录写入文件\n7:将文件写入通讯录\n8:退出\n");
scanf("%d",&x);
}while(x<1 || x>8);
switch(x)
{
case 1: InsertElem(&L); break;
case 2: DelElem(&L); break;
case 3: chazhao(&L); break;
case 4: paixu(&L); break;
case 5: output(&L); break;
case 6: save(&L); break;
case 7: writein(&L); break;
case 8: exit(0);
}
}

}


...全文
399 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-05-27
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
tonforce 2013-05-27
  • 打赏
  • 举报
回复

void InitSqlist(Sqlist *L)
{   //初始化      
    L->elem=(Node *)malloc(MaxSize*sizeof(Node));      
    if(!L->elem) exit(0);      

    memset(L->elem, 0, sizeof(Node)); // 增加这行,原因和你下面的两个初始化一样
    L->length=0;  // 楼主知道把L->length初始化为0   
    L->listsize=MaxSize; 
} 
kou753852951 2013-05-27
  • 打赏
  • 举报
回复
回复anshiny : 大师,程序太长,我就不引用了,谢谢修改,我会认真阅读的
kou753852951 2013-05-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
额...赵老师,虽然我不知道怎么替换,但我会在网上找资料,努力学习的 ,谢谢
kou753852951 2013-05-27
  • 打赏
  • 举报
回复
引用 1 楼 tonforce 的回复:

void InitSqlist(Sqlist *L)
{   //初始化      
    L->elem=(Node *)malloc(MaxSize*sizeof(Node));      
    if(!L->elem) exit(0);      

    memset(L->elem, 0, sizeof(Node)); // 增加这行,原因和你下面的两个初始化一样
    L->length=0;  // 楼主知道把L->length初始化为0   
    L->listsize=MaxSize; 
} 
呵呵 现在大二,以前还不知道 memeset, 今天刚看 C语言难点分析整理 才发现 每次内存也要初始化 谢谢了
anshiny 2013-05-27
  • 打赏
  • 举报
回复

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

#define MaxSize 50

typedef struct {     //定义结构体
	char   name[20];
	char   address[20];
	char   tel[12];
	char   youbian[8];
	char   Email[32];
}Node;

typedef struct {    //静态链表
	Node *elem;
	int  length;
	int  listsize;
}Sqlist;


void InitSqlist(Sqlist *L){            //初始化
	L->elem = (Node *)malloc(MaxSize*sizeof(Node));
	if(!L->elem) exit(0);
	L->length = 0;
	L->listsize = MaxSize;
}


void InsertElem(Sqlist *L){      //添加成员
	Node *base;
	int n = L->length;
	if(L->length >= L->listsize) {
		base = (Node *)realloc(L->elem, (L->listsize + 10) * sizeof(Node));
		L->elem = base;
		(L->listsize) += 10;
	}
	
	printf("please input %dth data: ",n+1); 
	printf("\n name   : ");
	scanf("%s",L->elem[n].name);
	printf("\n address: ");
	scanf("%s",L->elem[n].address);
	printf("\n tel    : ");
	scanf("%s",L->elem[n].tel);
	printf("\n youbian: ");
	scanf("%s",L->elem[n].youbian);
	printf("\n Email  : ");
	scanf("%s",L->elem[n].Email);
	printf("\n");
	L->length++;
}


void print(Sqlist *L,int n)    //输出单个成员信息
{
	printf("%d) 姓名: %s",n+1, L->elem[n].name);
	printf("\t地址:%s", L->elem[n].address);
	printf("\t电话:%s", L->elem[n].tel);
	printf("\t邮编:%s", L->elem[n].youbian);
	printf("\t邮箱:%s\n", L->elem[n].Email);
	return;	
}

int xunzhao(Sqlist *L)     //根据姓名查找成员的排序号
{
	char q[20];
	int i,n;
	printf("输入姓名:");
	scanf("%s",q);
	for(i=0;i<L->length;i++)
	{
        n=0; 
        while(L->elem[i].name[n]==q[n])
        {
			n++;
			if(n==(int)strlen(q))
			{
				return i;
			}
        }
	}
	return -1;
}


void output(Sqlist *L)  //输出所有成员信息
{
	int n=0;
	while(n<L->length)
	{
		print(L,n);
		n++;
		printf("\n");
	}
}


void DelElem(Sqlist *L)//根据成员姓名删除一个成员
{     
	Node *d,*q;
	int i;
	
	i=xunzhao(L);
	printf("\n%d \n\n",i+1);
	d=&(L->elem[i]);
	q=L->elem+L->length-1 ;
	for(++d;d<=q;++d)
	{
		strcpy((d-1)->name,d->name);
		strcpy((d-1)->address,d->address);
		strcpy((d-1)->Email,d->Email);
		strcpy((d-1)->youbian,d->youbian);
		strcpy((d-1)->tel,d->tel);
	}   
	L->length--;
	printf("\nOK \n\n");
}


void chazhao(Sqlist *L) //查找成员
{
	int i;
	i=xunzhao(L);
	print(L,i);
}


void swap(char a[],char b[])    //交换 两个字符串
{
	char q[30];
	strcpy(&q[0],&a[0]);
	strcpy(&a[0],&b[0]); 
	strcpy(&b[0],&q[0]);     
} 


void paixu(Sqlist *L)  //对所有成员按姓名进行排序
{ 
	int i,j;
	for(i=0;i<L->length;i++)
		for(j=i+1;j<L->length;j++)
		{                                           
			if(strcmp(L->elem[i].name,L->elem[j].name)>0)
			{
				swap(L->elem[i].name,L->elem[j].name);
				swap(L->elem[i].address,L->elem[j].address);
				swap(L->elem[i].Email,L->elem[j].Email);
				swap(L->elem[i].youbian,L->elem[j].youbian);
				swap(L->elem[i].tel,L->elem[j].tel);
			}
		}
		printf("\nOK \n\n");
}


void save(Sqlist *L){  //保存至文件 
	FILE *fp;
	int i;
	if((fp = fopen("d:\\output.txt","wb")) == NULL){
		printf("can not open file\n");
		return;
	}

	for(i=0; i<L->length; i++)
	{
		if(fwrite(&(L->elem[i]),sizeof(Node),1,fp)!=1)
			printf("file write error,\n");
	}
	printf("\nok\n\n");
	fclose(fp);      
}


void writein(Sqlist *L)   //由文件写入程序 
{
	FILE *fp;
	int i;
	long len;
	Node *base;
	if((fp=fopen("d:\\output.txt","rb"))==NULL) 
	{
		printf("can not open file\n");
		return;
	}

	fseek(fp, 0, SEEK_END);
	len = ftell(fp) / (int)sizeof(Node);
	fseek(fp, 0,SEEK_SET);
	L->length = 0;
	if(L->length >= L->listsize) {
		base = (Node *)realloc(L->elem, (L->listsize + 10) * sizeof(Node));
		L->elem = base;
		(L->listsize) += 10;
	}
	
	for(i=0; i<len; i++)
	{	
		if(fread(&(L->elem[i]),sizeof(Node),1,fp)!=1)
		{
			printf("file read error,\n");
			exit(0);
		}
		L->length++;
	}
	fclose(fp);
	output(L);
}


int main()
{
	int x;
	Sqlist L;
	InitSqlist(&L);
	while(1)
	{
		do
		{
			printf("请输入:\n1:插入\n2:删除\n3:查找\n4:排序\n5:输出\n6:将通讯录写入文件\n7:将文件写入通讯录\n8:退出\n");
			scanf("%d",&x);
		}while(x<1 || x>8);
		switch(x)
		{
		case 1:  InsertElem(&L); break;
		case 2:  DelElem(&L); break;
		case 3:  chazhao(&L); break;
		case 4:  paixu(&L);  break;
		case 5:  output(&L); break;
		case 6:  save(&L); break;       
		case 7:  writein(&L); break;
		case 8:  exit(0);
		}
	}
	return 0;
}
wubinyang 2013-05-27
  • 打赏
  • 举报
回复
赵老师很厉害的额,好厉害哈

70,020

社区成员

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

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