| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 372 人关注过本帖
标题:关于c语言的文件读取出现的问题,求大神指点
只看楼主 加入收藏
lihuiyu2_23
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-10-20
收藏
 问题点数:0 回复次数:1 
关于c语言的文件读取出现的问题,求大神指点
程序代码:
/*密码:123456 只有密码输入正确,才能进入plus程序.*/ 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>

#define LEN sizeof(S_MESSAGE)
#define N 10

typedef struct songer             //定义选手信息链表结构
{
    long num;                     //选手编号
    char name[20];                //选手姓名
    float grades[N];              //选手成绩
    double ave;                   //平均成绩
    struct songer * next;         //链表的结点,next是指针变量,指向结构体变量
}S_MESSAGE;

S_MESSAGE * head;                 //定义链表的头指针
S_MESSAGE * tail;                 //定义链表的尾指针
int n=0;                          // n为全局变量,用于统计结点的个数

void creat();                     //建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入
void del();                       //用于删除结点,用于参赛选手的删除
void search();                    //参赛选手成绩的查询
void print();                     //用于输出链表
void rank();                      //按个人平均成绩从高到低的顺序进行排序
void update();                    //参赛选手的修改
void menu();                      //操作系统菜单界面
void menu_select();               //菜单选择界面
void browse();                    //选手信息浏览
void save();                      //选手信息保存
void quit();                      //退出系统界面

/*------------------------------------ rank函数 -----------------------------------------*/

void rank()
{
    S_MESSAGE *p1,*p2,*endpt,*p;  //  *endpt/*控制循环比较*/   *p/*临时指针变量*/
    n=0;
    p1=head;
    
    if(head == NULL && tail == NULL)
    {
        printf("\n--------当前信息记录为空--------\n");
    }
    else
    {
        p1 = (S_MESSAGE *)malloc(LEN);
        p1->next = head;        /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/
        head = p1;              /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/
        for(endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/
        {
            for(p=p1=head; p1->next->next!=endpt; p1=p1->next)
            {
                if(p1->next->ave < p1->next->next->ave)    /*如果前面的节点键值比后面节点的键值小,则交换*/
                {
                    p2 = p1->next->next;             //1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next
                    p1->next->next = p2->next;       //2、顺着这一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->next
                    p2->next = p1->next;             //3、p2->next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next
                    p1->next = p2;                   //4、p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2
                    p = p1->next->next;              //5、至此,完成了相邻两节点的顺序交换
                }
            }
        }
        p1 = head;             /*把p1的信息去掉*/
        head = head->next;     /*让head指向排序后的第一个节点*/
        free(p1);              /*释放p1*/

        printf("\n-----------选手成绩排名信息如下---------\n");
        printf("--------|--------|--------|--------\n");
        printf("   编号 |  姓名  |平均成绩|  名次  \n");

        p1=head;
        while(p1 != NULL)
        {
            printf("--------|--------|--------|--------\n");
            printf("   %-9d%-9s%-9.1lf%-5d\n",p1->num,p1->name,p1->ave,n+1);
            n++;
            p1=p1->next;
        }
        printf("--------|--------|--------|--------\n");
    }
    getchar();
}

/*------------------------------------ print函数 -----------------------------------------*/

void print()
{
    S_MESSAGE * p1=(S_MESSAGE *)malloc(LEN);
    int check=0,i;
    long seeknum;
    printf("\n请输入要查找的选手编号:");
    scanf("%d",&seeknum);
    if(head == NULL && tail == NULL )
    {
        printf("\n对不起,当前记录为空!\n");
    }
    else
    {
        p1=head;
        printf("\n-----------你要找的选手的成绩如下---------\n");//在这里找到了要查找的选手成绩
        printf("------|------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|--------\n");
        printf(" 编号 | 姓名 | 成绩|  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  | 10  | 平均成绩\n");
        printf("------|------|-----|-----|-----|-----|-----|-----|-----|-----|---- |-----|-----|--------\n");
        while(p1 != NULL)
        {
            if(p1->num == seeknum)
            {
                printf(" %-7d%-6s",p1->num,p1->name);
                printf("      ");
                for(i=0;i<N;i++)
                {
                    printf(" %.1f ",p1->grades[i]);
                }
                printf("  %-6.2lf\n",p1->ave);
                check=1;
                getchar();
                return;
            }
            else
            {
                p1=p1->next;
            }
        }
    }
    if(head != NULL && check == 0)
    {
        printf("\n对不起,你查看的选手成绩不存在!\n");
    }
    getchar();    
}

/*--------------------------- search函数-------------------------------*/
                       
void search()
{
    int c;
    printf("\n请选择查询内容:\n");
    printf("1.选手详细成绩查询   2.选手排名查询\n请输入您的选择:");
    scanf("%d",&c);
    switch(c)
    {
    case 1:system("cls");print();break;
    case 2:system("cls");rank();break;
    }
}

/*------------------------------- save函数 ------------------------------*/

void save()//将数据保存到文件
{
    FILE *fp;
    S_MESSAGE *p1;//=(S_MESSAGE *)malloc(LEN);
    p1=head;
    fp=fopen("参赛选手名单.txt","w");
    fprintf(fp,"--------|--------\n");
    fprintf(fp,"   编号 |  姓名  \n");
    while(p1 != NULL)
    {
        fprintf(fp,"--------|--------\n");
        fprintf(fp,"   %-9d%-6s\n",p1->num,p1->name);
        p1=p1->next;
    }
    fprintf(fp,"--------|--------\n");
    fclose(fp);
    printf("\n\t文件已将保存到\"参赛选手名单.txt\"");
}

/*------------------------ update函数 --------------------------*/

void update()
{
    S_MESSAGE *p1;//=(S_MESSAGE *)malloc(LEN);
    int check=0; //用来进行判断,是否找到了要修改的信息
    long updatenum;
    printf("\n请输入要修改的选手编号:");
    scanf("%d",&updatenum);//查找到要修改的选手
    if(head == NULL && tail == NULL)
    {
        printf("\n--------当前信息记录为空--------\n");
    }
    else
    {
        p1=head;
        while(p1 != NULL)
        {
            if(p1->num == updatenum)
            {
        printf("\n-----------你要修改的选手信息如下---------\n");
        printf("--------|--------\n");
        printf("   编号 |  姓名  \n");
        printf("--------|--------\n");
        printf("   %-9d%-6s\n",p1->num,p1->name);
        printf("--------|--------\n");
        printf("\n-----------请重新写入此选手信息:---------\n");
            check=1;//从新写入修改项目
            printf("\n修改选手编号为:");
            scanf("%d",&p1->num);
            printf("\n修改选手姓名为:");
                scanf("%s",p1->name);
                return;
            }
            else
            {
                p1=p1->next;
            }
        }
    }
    if(head != NULL && check == 0)
    {
        printf("\n对不起,你要修改的选手信息不存在!\n");
    }
    getchar();
}

/*---------------------- browse函数 -----------------------------*/

void browse()
{
    S_MESSAGE *p1;
    if(head == NULL && tail == NULL)
    {
        printf("\n--------当前信息记录为空--------\n");
    }
    else
    {
        printf("\n-----------你要浏览的选手信息如下---------\n");
        printf("--------|--------\n");
        printf("   编号 |  姓名  \n");
        p1=head;
        while(p1 != NULL)
        {
            printf("--------|--------\n");
            printf("   %-9d%-6s\n",p1->num,p1->name);
            p1=p1->next;
        }
        printf("--------|--------\n");
    }
}

/*---------------------- del函数 --------------------------*/

void del()
{
    S_MESSAGE *node;//=(S_MESSAGE *)malloc(LEN);
    S_MESSAGE *p1;

    int check=0;  //用来进行判断,是否找到了要删除的信息
    long del_num;
    printf("\n请输入要删除的选手的编号:");
    scanf("%d",&del_num);

    if(head == NULL && tail ==NULL)
    {
        printf("\n当前信息记录为空,删除失败!\n");
    }
    else
    {
        node=head;
        p1=head;
        while(node != NULL)
        {
            if(node->num == del_num)
            {
             printf("\n--------要删除的选手信息--------\n");
             printf("--------|--------\n");
             printf("   编号 |  姓名  \n");
             printf("--------|--------\n");
            printf("   %-9d%-6s\n",node->num,node->name);   //在这里找到了要删除的选手信息
                printf("--------|--------\n");
                check=1;                                    //找到要删除的信息,赋为真
                if(node == head && head->next == NULL)            //是头结点,并且只有一个结点
                {
                    head=NULL;
                    tail=head;
                    free(node);
                    printf("\n--------删除信息成功--------\n"); //删除唯一的节点
                }
                else if(node == head && head->next != NULL)     //删除头节点
                {
                    node=head;
                    head=head->next;
                    free(node);
                    printf("\n--------删除信息成功--------\n"); //头节点删除成功
                    n=n-1;
                }
                else if(node ->next != NULL)  //删除中间节点
                {
                    p1->next=node->next;
                    free(node);
                    printf("\n--------删除信息成功--------\n"); //中间节点删除成功
                    n=n-1;
                }
                else if(node->next == NULL)   //删除尾节点
                {
                    p1->next=NULL;
                    tail=p1;
                    free(node);
                    printf("\n--------删除信息成功--------\n"); //尾节点删除成功
                    n=n-1;
                }
                getchar();
                return;
            }
            else
            {
                p1=node;
                node=node->next;
            }
        }
    }
    if(head != NULL && check == 0)
    {
        printf("\n对不起,你要删除的选手信息不存在!\n");
    }
    getchar();
}

/*--------------- creat函数 -----------------------*/

void creat()
{    
    int i,j;
    float t;
    char c='y';

    while(c == 'y' || c == 'Y')
    {
    S_MESSAGE *p1=(S_MESSAGE *)malloc(LEN);
    printf("\n请输入要录入的选手信息:\n");
    printf("\n选手编号:");
    scanf("%d",&p1->num);

    printf("\n选手姓名:");
    scanf("%s",p1->name);
    printf("\n请输入10位评委点评成绩:");
    
    p1->ave = 0;
    for(i=0;i<N;i++)
    {
        scanf("%f",&(p1->grades[i]));       //runtime error
        p1->ave += p1->grades[i];
    }

    for(i=0;i<N-1;i++)                            //冒泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个
        for(j=0;j<N-1-i;j++)
            if(p1->grades[j]>p1->grades[j+1])
            {
                t=p1->grades[j];
                p1->grades[j]=p1->grades[j+1];
                p1->grades[j+1]=t;
            }
    p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一个最高分,去掉一个这一低分,得出最后的平均分

    p1->next=NULL;

    if(p1==NULL)
    {
        printf("\n内存分配失败\n");
        n=n-1;
    }

    if(head == NULL && tail == NULL) //当前没有结点,创建第一个结点
    {
        head=p1;
        head->next=NULL;
        tail=head;
        printf("\n------选手信息录入成功------\n");
    }
    else     //如果当前还有节点则插入到尾部
    {
        tail->next=p1;
        tail=p1;
        tail->next=NULL;
        printf("\n------选手信息录入成功------\n");
    }
    printf("是否继续(Y/N):");
    getchar();
    scanf("%c",&c);
    }
}

/*---------------------- quit函数 ----------------------------*/

void quit()
{
    printf("\n\n\t==========》感谢您使用歌唱比赛评分系统(制作人:LHY)《==========\n\n");
}

/*------------------------------------- menu函数 -----------------------------------------*/

void menu()
{
    printf("\n\n\t********** 歌唱比赛评分系统***********\n\n");
    printf("\   1.选手信息浏览             2.选手信息录入 \n");
    printf("\   3.选手信息保存             4.选手成绩查询 \n");
    printf("\   5.选手信息修改             6.选手信息删除 \n");
    printf("\                7.退出系统                  \n");
    printf("\n\ *********** 系统菜单选择界面*************\n");
    printf("\t>> 请根据您想执行的命令,输入对应功能的数字键<<\n");
    printf("请输入您的选择:");
}

/*---------------- menu_select函数 ------------------------*/

void menu_select()
{
    char s[100];
    int c;
    gets(s);               //不管用户输入的是数字键或是字母键使用gets都能将输入作为字符串接收

    while(1)               //限定用户输入的数值必须在1-7之间才有效,否则要求重新输入
    {
        c = atoi(s);       //利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断
        if(c < 1 || c >7)
        {
            printf("您的输入有误,请重新输入:");
            gets(s);       
        }
        else break;
    }

    switch(c)
    {
    case 1:
        system("cls");          //清屏
        browse();
        break;
    case 2:
        system("cls");
        creat();
        break;
    case 3:
        system("cls");
        save();
        break;
    case 4:
        system("cls");
        search();
        break;
    case 5:
        system("cls");
        update();
        break;
    case 6:
        system("cls");
        del();
        break;
    case 7:
        system("cls");
        quit();
        return;
        break;
    default:
        break;
    }
    getchar();
    system("cls");
    menu();
    menu_select();
}

/*--------------------------main函数 -----------------------------*/

int plus()
{
    menu();
    menu_select();
    return 0;
}
int main(void) 
{ 
char c[6]; 
char m[6]; 
m[0]='1',m[1]='2',m[2]='3',m[3]='4',m[4]='5',m[5]='6'; 
int i; 
printf("请输入您的密码:"); 
for(i=0;i<6;i++) 
{ 
c[i]=getch(); 
if(c[i]>='0'||c[i]<='9'||c[i]>='a'||c[i]<='z'||c[i]>='A'||c[i]<='Z') 
putchar('*'); 
} 
if(c[0]==m[0]&&c[1]==m[1]&&c[2]==m[2]&&c[3]==m[3]&&c[4]==m[4]&&c[5]==m[5]) 
{ printf("\n欢迎进入歌唱比赛评分系统(制作人:LHY)!\n"); 
plus(); 
} 
else 
printf("\n密码错误!"); 

while(1); 
return 0; 
}


以上是代码,在运行之后录入歌手信息保存之后,关闭程序再打开显示记录为空,希望大神帮忙解决一下,我也能学习一下
搜索更多相关主题的帖子: c语言 
2015-03-29 23:37
lihuiyu2_23
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-10-20
收藏
得分:0 
程序写入的数据似乎保存在内存里,我想把它保存到txt里面,并且重新打开时依旧可以读取txt的数据
2015-03-29 23:47
快速回复:关于c语言的文件读取出现的问题,求大神指点
数据加载中...
 
   



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

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