首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-06-25 
C写的通讯录,将数据写入文件时多了点东西,从文件读出时出错,求指教/*班级通讯录管理系统以本班同学的具体

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


/*班级通讯录管理系统
以本班同学的具体数据为背景,设计实现一个本班同学通讯录管理系统,实现以下功能:
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);
       }
      }

}
 


  C
[解决办法]

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; 


[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

------解决方案--------------------



#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;
}

热点排行