| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 316 人关注过本帖
标题:文件问题有点生疏,同学向你诚恳请教
只看楼主 加入收藏
林浩
Rank: 2
等 级:论坛游民
帖 子:47
专家分:23
注 册:2011-1-12
结帖率:90.91%
收藏
已结贴  问题点数:10 回复次数:1 
文件问题有点生疏,同学向你诚恳请教
想文件stud.c输出5个学生的数据,然后又输出来,我用数组已经做出来了,但想到一些排序,插入等操作,就换成链表来做,结果over了,不要给我代码,就具体说说,那个地方出了问题,或是概念有什么误差,谢谢!!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NULL 0

struct student
{
    int num;
    char name[10];
    float score[4];
    struct student *next;
}stu;

struct student *creat(struct student *head, int n)  //建立链表
{
    struct student *p1, *p2;
    int i, j;
   
    p2=p1=(struct student *)malloc(sizeof(struct student));
    printf("请输入数据:\n");
    for(i=0;i<n;i++)
    {
        scanf("%d%s%", &p1->num, p1->name);
        for(j=0;j<3;j++)
        {
            scanf("%f", &p1->score[j]);
        }
        p1->score[j]=(p1->score[0]+p1->score[1]+p1->score[2]) / 3;
        if(i==0)
        {
            head=p1;
        }
        p2=p1;
        p1=(struct student *)malloc(sizeof(struct student));
        p2->next=p1;
    }
    free(p1);
    p2->next=NULL;
    return(head);
}

void save(struct student *head)   //存放数据到stud.c文件中
{
    FILE *p;
    struct student *p1;

    p1=head;

    if((p=fopen("stud.c", "wb"))==NULL)
    {
        printf("对不起,不能打开该文件\n");
        exit(0);
    }
   
    while(1)
    {
        if(fwrite(p1, sizeof(struct student), 1, p)!=1)
            printf("文件录入错误\n");
        if(p1->next=NULL)
        {
            break;
        }
        p1=p1->next;
    }
}

int main()
{
    FILE *p1;
    int j;
    struct student *head, *p=NULL;

    head=&stu;
    head=creat(head, 5);
    save(head);
    p=head;
   
    p1=fopen("stud.c", "rb");
    printf("请输出数据 :\n");
    printf("学号\t姓名\t学科1\t学科2\t学科3\t平均分\n");
    while(1)                                           //读入stud.c中的数据,并输出。
    {
        fread(p, sizeof(struct student), 1, p1);
        printf("%d\t%s\t", p->num, p->name);
        for(j=0;j<4;j++)
        {
            printf(" %.2f\t", p->score[j]);
        }
        if(p->next==NULL)
        {
            break;
        }
        p=p->next;
    }

    fclose(p1);

    return 0;
}
搜索更多相关主题的帖子: include 概念 next 
2011-04-04 11:51
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:10 
首先malloc和free,LZ到处用,这是不对的,这里只用给p1开动态空间就行了
还有就是结构指针用的不对,比如有i->next=j,要把p插在i之后j之前,就得用i->next=p,p->next=j
如果是建立链表的时候,放头结点:p1->next=NULL;head=p1;然后再判断head->next是否非空,这样依次放在链尾,每次链尾一定要加p->next=NULL,不然无法判断是否到达链尾
在保存入文件的时候,lz的代码p1->next=NULL,少了个等号
在从文件读出的时候,要考虑现有链表的数据,最好先将之前的内存释放掉,再读,还有要判断是否到底部用feof(fp)停止

我的地盘
2011-04-04 12:53
快速回复:文件问题有点生疏,同学向你诚恳请教
数据加载中...
 
   



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

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