| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 541 人关注过本帖
标题:求助 文件写入问题
只看楼主 加入收藏
klpk521
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-11-28
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
求助 文件写入问题
设计一个学生作业管理程序 即使什么都没有操作直接退出程序也会向文件写入一堆看不懂的数据
另外 delete_one 函数也运行不了
还有用链表求平均值如何求?
求高
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
#define INPUT %d %d %s %d %d %d %d %d %d %d %d %d %d
#define SCANF &pC->num,&pC->Class,pC->name,&pC->finish[0],&pC->finish[1],&pC->finish[2],&pC->finish[3],&pC->finish[4],&pC->finish[5],&pC->finish[6],&pC->finish[7],&pC->finish[8],&pC->finish[9]
#define PRINT pC->num,pC->Class,pC->name,pC->finish[0],pC->finish[1],pC->finish[2],pC->finish[3],pC->finish[4],pC->finish[5],pC->finish[6],pC->finish[7],pC->finish[8],pC->finish[9]
struct student
{
    int num;
    int Class;
    char name[10];
    int finish[10];
    struct student * next;
};
   
struct student *insert(struct student *head,
                       struct student *pNode)
{
    // pPrev为前驱结点位置,pNext为后继结点位置
    struct student *pPrev,*pNext;
    pNext = head;
    if(head == NULL) {     //空链表
        head = pNode;      //插入到第一个位置
        pNode->next = NULL;
    }else{                 //非空链表                      
        /*
        查找插入位置。
        将pNode->num与pNext->num相比较,
        如果pNode->num > pNext-> num ,
        则待插入的结点应插在pNext所指的结点之后的某个位置,
        此时将pNext后移,并使pPrev指向刚才pNext所指的结点.
        */
        while((pNext != NULL) &&
              (pNode->num > pNext->num))  {
            pPrev = pNext;   
            pNext = pNext->next;
        }
            
        if (pNext == NULL)  {   //未找到插入位置
            pPrev->next = pNode;//插入到链表最后位置
            pNode->next = NULL;
        }else{
            if(head == pNext)   //第一个位置
                head = pNode;
            else                //其他位置
                pPrev->next = pNode;    
          
            pNode->next = pNext;
        }
    }
    return head ;
}
struct student * add_score()
{
    struct student *head = NULL;
    struct student *pC,*pEnd;
    pC =pEnd =(struct student*) malloc(LEN);
    puts("请输入学号(输入0退出):");
    scanf("%d",&pC->num);
    if(pC->num==0)
    {return head;}
    else
    puts("\n请输入班级(如:1):");
    scanf("%d",&pC->Class);
    puts("\n请输入姓名:");
    scanf("%s",pC->name);
    puts("\n请输入十次成绩:");
    scanf("%d %d %d %d %d %d %d %d %d %d",&pC->finish[0],&pC->finish[1],&pC->finish[2],&pC->finish[3],&pC->finish[4],&pC->finish[5],&pC->finish[6],&pC->finish[7],&pC->finish[8],&pC->finish[9]);
    while(pC->num>0)
    {
        if(head==NULL)
        {
            head=pC;
        }
        else
        {
            pEnd->next = pC;
        }
        pEnd=pC;
   
        head = insert(head , pC);
   
        pC=(struct student*)malloc(LEN);
      
        puts("请输入学号(输入0退出):");
        scanf("%d",&pC->num);
        if(pC->num==0)
        {return head;}
        else
        puts("\n请输入班级(如:一班):");
          scanf("%d",&pC->Class);
        puts("\n请输入姓名:");
         scanf("%s",pC->name);
        puts("\n请输入十次成绩:");
         scanf("%d %d %d %d %d %d %d %d %d %d",&pC->finish[0],&pC->finish[1],&pC->finish[2],&pC->finish[3],&pC->finish[4],&pC->finish[5],&pC->finish[6],&pC->finish[7],&pC->finish[8],&pC->finish[9]);
    }
    pEnd->next=NULL;
    return head;
}
struct student *display_one(struct student *head, int num)
{
    struct student *pC = head;
    if(num==0)
    {return head;}
    else
    {
        if(pC==NULL)
        puts("数据不存在.");
        else
        {
            while(pC != NULL && num != pC->num)
            {
                pC = pC->next;
            }
            if(pC==NULL)
            {
                printf("找不到该学号!\n");
            }
          
            else
            printf("%d %d %s %d %d %d %d %d %d %d %d %d %d \n",pC->num,pC->Class,pC->name,pC->finish[0],pC->finish[1],pC->finish[2],pC->finish[3],pC->finish[4],pC->finish[5],pC->finish[6],pC->finish[7],pC->finish[8],pC->finish[9]);
        }
    }
    return head;
}



struct student *display_class(struct student *head,int Class)
{
    struct student *pC = head;
    while(pC!=NULL && Class==pC->Class)
    {
        printf("%d %d %s %d %d %d %d %d %d %d %d %d %d\n",pC->num,pC->Class,pC->name,pC->finish[0],pC->finish[1],pC->finish[2],pC->finish[3],pC->finish[4],pC->finish[5],pC->finish[6],pC->finish[7],pC->finish[8],pC->finish[9]);
        pC=pC->next;
    }
    return head;
}
struct student *alter(struct student *head,int num)
{
    int i,score;
    struct student *pC=head;
  
    if(head==NULL)
    {
        printf("学号不存在.");
        return NULL;
    }
    while(pC!=NULL && num!=pC->num)
    {
        pC=pC->next;
    }
   printf("pC == %p\n", pC);
    while(i!=0)
    {
        printf("您想要更改第几次作业情况?(输入0退出)\n");
           scanf("%d",&i);
           if(i!=0)
           {
               printf("\n请输入分数:");
               scanf("%d",&pC->finish[i-1]);
           }
    }
    return head;
}
struct student *delete_one(struct student *head, int num)
{
    struct student *pC,*pP;
    pC = head;
    if (pC == NULL)
    { 
        printf("没有数据.\n");
        return NULL;
    }
      printf("still");
    while (pC != NULL && num != pC->num)
    {
         pP = pC;
         pC = pC->next;
    }
  
    if(pC!=NULL)
    {
        printf("删除学号:%d\n", num);
      
        if  (pC == head)
        {
            head = pC->next;                
        }
        else
        {               
            pP->next = pC->next;
        }
        free(pC);
    }
    else
    {
        printf("学号 %d 不存在!\n",num);
    }
  
    return head;      
}
//struct student *
void fileread(struct student *head)
{
    FILE *fp;
    struct student *pC = head;
    if((fp=fopen("record.txt","r"))==NULL)
    {
        printf("文件打开错误!");
    }

    while(pC!=NULL)
    {
   
        fscanf(fp,"%d %d %s %d %d %d %d %d %d %d %d %d %d\n",&pC->num,&pC->Class,pC->name,&pC->finish[0],&pC->finish[1],&pC->finish[2],&pC->finish[3],&pC->finish[4],&pC->finish[5],&pC->finish[6],&pC->finish[7],&pC->finish[8],&pC->finish[9]);
        pC=pC->next;
    }
    fclose(fp);
}

void filesave(struct student *head)
{
    FILE *fp;
    struct student *pC=head;

    if((fp=fopen("record.txt","w+"))==NULL)
    {
        printf("文件打开错误!");
        exit(0);
    }

    if(pC==NULL)
        printf("error");
    else
    {
        while(pC!=NULL)
        {
            fprintf(fp,"%d %d %s %d %d %d %d %d %d %d %d %d %d\n",pC->num,pC->Class,pC->name,pC->finish[0],pC->finish[1],pC->finish[2],pC->finish[3],pC->finish[4],pC->finish[5],pC->finish[6],pC->finish[7],pC->finish[8],pC->finish[9]);
            pC=pC->next;
        }
    }
    fclose(fp);
}

int main()
{
    struct student * head ;
    int num;
    int choice,Class;

    fileread(head);

    while (choice!=7)
    {
        printf("\t\t\t欢迎进入学生作业完成情况管理系统\n");
        printf("\t\t\t--------------------------------\n\n\n");
        printf("1.录入某位学生某次作业的分数\n");
        printf("2.给定学号,显示某位学生的作业完成情况\n");
        printf("3.给定某个班级的班号,显示该班所有学生的作业完成情况\n");
        printf("4.给定某位学生的学号,修改该学生的作业完成信息\n");
        printf("5.给定某位学生的学号,删除该学生的信息\n");
        printf("6.提供一些统计各类信息的功能\n");
        printf("7.退出\n\n");
        printf("请选择功能:");

    scanf("%d",&choice);

    switch (choice)
    {
    case 1:
    add_score();break;

    case 2:
    printf("请输入学号:");
    scanf("%d",&num);
    display_one(head,num);break;

    case 3:
    printf("请输入班级:");
    scanf("%d",&Class);
    display_class(head,Class);break;

    case 4:
    printf("请输入学号:");
    scanf("%d",&num);
    alter(head,num);break;

    case 5:
    printf("请输入学号:");
    scanf("%d",&num);
    delete_one(head,num);break;

    case 6:
    break;

    case 7:
    break;
    }
    }
    filesave(head);

    return 0;
}
人点拨
搜索更多相关主题的帖子: 如何 color 平均值 管理程序 设计 
2011-12-15 20:29
klpk521
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-11-28
收藏
得分:0 
麻烦帮看看
2011-12-16 10:25
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:10 
每个问题答复如下:
1、即使什么都没有操作直接退出程序也会向文件写入一堆看不懂的数据
    从你代码看,即使输入7,也会调用filesave(head);,即会保存数据到文件。至于数据来源,
void fileread(struct student *head)
{
    FILE *fp;
    struct student *pC = head;
    if((fp=fopen("record.txt","r"))==NULL)
    {
        printf("文件打开错误!");
        //应该添加return,再操作文件句柄会出错。
    }
    while(pC!=NULL)
    {...}
    fclose(fp);
}


2、另外 delete_one 函数也运行不了
    可以从代码函数void fileread(struct student *head)看出,传入的参数仅仅是一个指针,链表头根本没有建立起来,删除当然不成功,并且,你没有给head赋初值,系统默认为0xcccccccc,如果用NULL判断,会导致内存出错。


3、还有用链表求平均值如何求?
    链表求平均值和数组没有任何差别,仅仅是一个while循环。
    while(curNode)
   {
       curNode = curNode->next;
   }

2011-12-16 11:30
klpk521
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-11-28
收藏
得分:0 
回复 3楼 silent_world
1.fileread 函数里面对每个数据结构的读取是否要在循环里加malloc?(助教说的)
2.怎么操作才能建立起链表而不是只是传入了*head?

经过很多次测试发现fileread函数的问题很多 是否能写一个完整的函数?  十分感谢
2011-12-16 12:00
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
1.fileread 函数里面对每个数据结构的读取是否要在循环里加malloc?(助教说的)
答复:所谓的链表,仅仅是在计算机内存中申请一些空间,用指针将这些空间关联起来。关联的目的,是可以根据其头指针,访问计算机内存中离散的不同数据,原理就是计算机中常说的间接取数。
    由于计算机仅仅是机器,是个笨家伙,需要编程来控制其所有行为,如申请内存(malloc),将内存关联到链表中(preNode->next = curNode),每个节点赋值。如果是从文件取数,需要针对每组数据建立一个节点,直到文件数据取完为止(while())。
2、怎么操作才能建立起链表而不是只是传入了*head?
答复:首先,你需要建立一个head头(malloc),并且,获取其头部地址;其次,将其他节点串联上即可。
3、经过很多次测试发现fileread函数的问题很多 是否能写一个完整的函数?
答复:需要写成一个函数。另外,你在读文件时尽量不要使用fscanf("%s"),套用上面的话,计算机是个笨家伙,它不知道取多长的数据,只知道到0截至,如果你下一位数据比较大,没有零位,就会出错。

呵呵,更多东西自己领悟。多背背书,多思考每个字段意思,多上机练习就行了。



2011-12-17 09:30
快速回复:求助 文件写入问题
数据加载中...
 
   



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

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