| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13140 人关注过本帖
标题:关于从文件中读取数据并写入结构体数组
只看楼主 加入收藏
younkoon
Rank: 1
等 级:新手上路
威 望:1
帖 子:13
专家分:0
注 册:2016-9-22
结帖率:100%
收藏
已结贴  问题点数:25 回复次数:10 
关于从文件中读取数据并写入结构体数组
各位大大好,本人新手一枚,最近写简单的通讯录的c程序,其他功能完好,最后一个将txt文件中的数据写入结构体数组的函数无法正常使用。
程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<conio.h>
struct txl          /*定义结构体数组*/
{
    char name[20];
    char phone[12];
}per[100];
int num=0;
FILE *fp;
void menu();
    void xj();
    void cx();
    void cxname();
    void cxphone();
    void sc();
    void showall();
    void xg();
    void xgwj(int i);
    void d();
void x();

   
   
    void main(int argc,char* argv[])    /*主函数,只用来打开菜单函数*/
    {
        while(1)
        {
            menu();
        }
    }
    void menu()   /*菜单函数*/
    {system("cls");
    int a;
        printf("\t\t\t*************************\n");
        printf("\t\t\t**  1:      新建       **\n");
        printf("\t\t\t**  2:      查询       **\n");
        printf("\t\t\t**  3:      修改       **\n");
        printf("\t\t\t**  4:    显示所有     **\n");
        printf("\t\t\t**  5:      删除       **\n");
        printf("\t\t\t**  6:               **\n");
        printf("\t\t\t**  7:               **\n");
        printf("\t\t\t*************************\n");
        printf("按对应键进入对应功能:");
scanf("%d",&a);
     switch(a)                /*用switch语句调用子函数*/
     {
     case 1:xj();break;
     case 2:cx();break;
     case 3:xg();break;
     case 4:showall();break;
     case 5:sc();break;
     case 6:d();break;
     case 7:x();break;
     }
    }

void xj()       /*新建联系人函数*/
{
char c;
printf("输入姓名\n");
scanf("%s",&per[num].name);        /*写入结构体数组*/
printf("输入电话\n");
scanf("%s",per[num].phone);
num++;
printf("按任意键返回菜单!");
c=getche();                 /*每写入一个数据num加1*/
}


void showall()            /*全部显示函数*/
{
    int i;char c;
    printf("联系人:\n姓名\t电话\n");
    for(i=0;i<num;i++)
    {
     printf("%s\t",per[i].name);
     printf("%s\n",per[i].phone);
    }printf("按任意键返回菜单!");
    c=getche();
    return;
}
void cx()      /*查询函数*/
{
    int a;
    printf("欢迎进入查询功能。\n1:按姓名查找\n2:按电话查找。\n按其他键返回主菜单");
    scanf("%d",&a);
    switch(a)
    {
    case 1:cxname();break;
    case 2:cxphone();break;
    default:menu();break;
    }

}
void cxname()    /*按姓名查找*/
{
    int mark=0;
    int i;char c;
    char name[20];
    printf("请输入姓名");
    scanf("%s",name);
    for(i=0;i<num;i++)
    {
        if(strcmp(per[i].name,name)==0)   /*对比查找*/
        {
        
            printf("您查找的联系人为:\n");
            printf("---------------------\n");
            printf("姓名:%s\n",per[i].name);
            printf("电话:%s\n",per[i].phone);
            printf("---------------------\n");
            for(i=i+1;i<num;i++)
    {
        if(strcmp(per[i].name,name)==0)   /*对比查找*/
        {
        
            printf("您查找的联系人为:\n");
            printf("---------------------\n");
            printf("姓名:%s\n",per[i].name);
            printf("电话:%s\n",per[i].phone);
            printf("---------------------\n");}}
            printf("按任意键返回菜单!");
            c=getche();
            return;
        }
   
    }
}
void cxphone()           /*按电话号码查找*/
{
    int i;
    char c;
    int a=0;
    char m[11];
    printf("请输入电话\n");
    scanf("%s",m);
    for(i=0;i<num;i++)
    {
        if(strcmp(per[i].phone,m)==0)     /*对比查找*/
        {

            printf("您查找的联系人为:\n");
            printf("---------------------\n");
            printf("姓名:%s\n",per[i].name);
            printf("电话:%s\n",per[i].phone);
            printf("---------------------\n");
            printf("按任意键返回菜单!");
            c=getche();     
            return;
}    }}
void xg()     /*修改函数*/
{
    int a=0;
    int i,j;
    char name[20];
    printf("请输入要修改联系人的姓名\n");
    scanf("%s",&name);
    for(i=0;i<num;i++)
    {
        if (strcmp(per[i].name,name)==0)    /*对比查找*/
        {
            printf("以下是目标联系人信息\n");
            printf("---------------------\n");
            printf(" 姓名:%s\n",per[i].name);
            printf(" 电话:%s\n",per[i].phone);
            printf("---------------------\n");
            printf("是否修改?确认请按1,返回请按2.\n");
            scanf("%d",&j);
            switch(j)
            {
            case 1:xgwj(i);break;
            case 2:menu();break;
            }
        }
    }
}
void xgwj(int i)     /*子函数,目的是将新的变量写入数组*/
{
    printf("请选择需要修改的项目\n1:姓名。\n2:电话\n");
    int j;
    char c;
    scanf("%d",&j);
    switch(j)
    {
    case 1:printf("请输入新的内容\n");scanf("%s",&per[i].name);break;
    case 2:printf("请输入新的内容\n");scanf("%s",&per[i].phone);break;
    }
    printf("修改成功!");
    printf("按任意键返回菜单!");
            c=getche();
}

void sc()    /*删除函数*/
{
    int a=0;
    int i,k,j;
    char name[20];
printf("请输入你要删除联系人的姓名");
scanf("%s",&name);
for(i=0;i<num;i++)
    {
        if (strcmp(per[i].name,name)==0)   /*对比查找*/
        {
            printf("以下是目标联系人信息 \n");
            printf("---------------------\n");
            printf(" 姓名:%s\n",per[i].name);
            printf(" 电话:%s\n",per[i].phone);
            printf("---------------------\n");
            printf("是否删除?\n1:是\n2: 否\n");
            scanf("%d",&k);
            if(k==1)
            {for(j=i;j<num-1;j++)
            per[j]=per[j+1];           /*数据前移覆盖*/
            num--;
            printf("删除成功\n");
            }

}
}
printf("按任意键返回菜单!");
getche(); }


void x() //将结构体数组中的数据写入txl文件中
{int i;
if((fp=fopen("c:\\txl.txt","w++"))==NULL)
{printf("can not open");
exit(1);}
else
{for(i=0;i<num;i++)
fprintf(fp,"%20s%12s\n",per[i].name,per[i].phone);
}fclose(fp);}

void d()//将文件中的数据读入结构体数组中
{
int i;
if((fp=fopen("c:\\txl.txt","r"))==NULL)
{printf("can not open");
exit(1);
}
else
{for(i=0;i<num;i++)
fscanf(fp,"%20s%12s\n",per[i].name,per[i].phone);
fclose(fp);}}

程序能够运行且其他功能完好。经过检测,最后三行语句没有产生作用。希望各位大大能指点指点,帮忙解决,谢谢!
搜索更多相关主题的帖子: include 通讯录 结构体 c程序 
2016-10-23 11:04
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:13 
fp=fopen("c:\\txl.txt","w++")   //路径的问题
D://tx1.txt就行
或者tx1.txt    当前路径下
2016-10-23 11:42
younkoon
Rank: 1
等 级:新手上路
威 望:1
帖 子:13
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 2楼 word123
试过了,还是一样。
2016-10-23 12:14
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
你是不是一运行程序就执行读入函数,但是你的num此时是0,循环不会执行,根本不会读入数据
2016-10-23 12:28
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
你读出文件里的数据不应该以大小来限制,而是读出文件所有数据,循环条件应该是文件是否读完
2016-10-23 12:32
younkoon
Rank: 1
等 级:新手上路
威 望:1
帖 子:13
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 5楼 word123
那应该是用指针?然后判断指针是否移到了文件的最后?那应该怎么写呢?
2016-10-23 13:18
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:13 
w++是什么鬼。表示没玩过
改成w+
2016-10-23 13:35
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
1、程序没的结束代码。
2、最后一个读取文件信息用num来确定读取文件数据的数量不合适吧。如果程序没关闭用来修改文件信息也就凑合着用,如果关了程序再开起来,num显然是
   错的,那么用来读取文件里的数据就不对了。

2016-10-23 13:42
younkoon
Rank: 1
等 级:新手上路
威 望:1
帖 子:13
专家分:0
注 册:2016-9-22
收藏
得分:0 
回复 8楼 linlulu001
那请问一下应该怎么写?
2016-10-23 18:27
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
去查下feof函数的用法,用这个函数判断文件是否到结尾会更好。
2016-10-23 22:23
快速回复:关于从文件中读取数据并写入结构体数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017689 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved