| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 559 人关注过本帖
标题:关于fwrite,fread函数问题,最后怎么好像多东西了。。
只看楼主 加入收藏
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
结帖率:88.89%
收藏
已结贴  问题点数:30 回复次数:5 
关于fwrite,fread函数问题,最后怎么好像多东西了。。
呃,伸手党再次现身了。。。。

我定义了一个用于创建链表结点的数组,创建链表以后,用fwrite存入一个文件,然后fread读取该文件重新构建链表。问题来了,(文件是二进制文件,文本文件也行)在存入时还是比较顺利的,但是在读取的时候运行流程出现问题:(我感觉文件已经结束了呀,为什么没有结束)


// 函数名称:Load
// 函数作用:根据文件名载入一个二进制文件数据并建立链表,返回链表头指针
// 创建时间:2014年3月27日21:38:12
// 返回值类型:DATA *
// 形式参数:char *
DATA *Load(char *fileName)
{
    FILE *fp = NULL;
    DATA *head = NULL;
    DATA temp;
    DATA *pt = &temp;
    DATA *p1 = NULL;
    DATA *p2 = NULL;
    //int i = 1;

    if (NULL == (fp = fopen(fileName, "rb")))
    {
        printf("文件%s打开失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }
    if (fread(pt, LEN, 1, fp) != 1)
    {
        printf("文件%s读取失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }

    for (; feof(fp) == 0;) // 读取最后一个结点(尾结点)后,feof(fp)还是不等于0,然后会再进行一次for循环,就进行if(fread)下面的else分支
    {
        p1 = (DATA *)malloc(LEN);
        *p1 = temp;
        //printf("第%d个结点存入。\n", i++);
        if (NULL == head)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        if (fread(pt, LEN, 1, fp) != 1)
        {
            
            if (feof(fp) == 1)
            {
                printf("文件%s读取结束。\n", fileName);
            }
            else
            {
                printf("文件%s读取失败。\n", fileName);
                printf("%-6d%-6s%-6d\n", pt->num, pt->name, pt->score);
            }
        }
    }
    fclose(fp);

    printf("文件%s数据读取成功,已建立链表。\n", fileName);
    return(head);
}
程序还有很多问题,呃大牛清喷,如果能给些建议感激不尽!~ 呃这不是这帖子主题啦

这是前面的定义:

#define LEN sizeof(DATA)

typedef struct abc
{
    int  num;
    char name[10];
    int  score;
    struct abc *next;
}DATA;

发一下全部函数,有点长,Save函数还有Creat函数都在里面。
程序代码:
/*由于生疏,所以复习一下链表,包括创建,增加,删除,排序,以及文件的读取和存储*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define LEN sizeof(DATA)

typedef struct abc
{
    int  num;
    char name[10];
    int  score;
    struct abc *next;
}DATA;


// 函数名称:Creat
// 函数作用:建立链表 
// 创建时间:2014年3月21日0:07:02
// 返回值类型:DATA *
// 形式参数:void
DATA *Creat(void)
{
    int temp = 0;
    DATA *p1 = NULL;
    DATA *p2 = NULL;
    DATA *head = NULL;

    printf("请输入数据:(当号码为0时输入结束)\n");
    printf("请输入号码:\n");
    scanf("%d", &temp);

    for (; temp != 0;)
    {
        p1 = (DATA *)malloc(LEN);
        p1->num = temp;
        printf("请输入名字和分数:\n");
        scanf("%s%d", p1->name, &p1->score);
        if (NULL == head)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        printf("请输入号码:\n");
        scanf("%d", &temp);
    }
    p2->next = NULL;
    printf("链表已成功创建。\n");
    return(head);
}

// 函数名称:Print
// 函数作用:输出链表
// 创建时间:2014年3月21日0:20:13
// 返回值类型:void
// 形式参数: DATA *
void Print(DATA *head)
{
    DATA *p = head;
    
    if (p == NULL)
    {
        printf("链表为空。\n");
    }
    else
    {
        printf("Num   Name  Score\n");
        for(; p != NULL;)
        {
            printf("%-6d%-6s%-6d\n", p->num, p->name, p->score);
            p = p->next;
        }
    }
    printf("链表数据已输出。\n");
}

// 函数名称:Delete
// 函数作用:根据形参删除该序号某结点(链表数据都不一样)
// 创建时间:2014年3月21日0:28:50
// 返回值类型:DATA *
// 形式参数:DATA *, int
DATA *Delete(DATA *head, int temp)
{
    DATA *p1 = head;
    DATA *p2 = NULL; 

    if (NULL == p1)
    {
        printf("链表为空,无数据。\n");
    }
    else 
    {
        for (p2 = p1; (p1 != NULL)&&(p1->num != temp);)
        {
            p2 = p1;
            p1 = p1->next;
        }
        if (NULL == p1)
        {
            printf("链表无该数据。\n");
        }
        else
        {
            if (p1 == head)
            {
                head = p1->next;
            }
            else
            {
                p2->next = p1->next;
            }
            free(p1);
            p1 = NULL;
            printf("数据编号为%d的结点已经从链表中删除。\n", temp);
        }
    }
    return(head);
}

// 函数名称:DeleteName
// 函数作用:删除链表中具有该名字的结点(可能有多个)
// 创建时间:2014年3月21日1:04:20
// 返回值类型:DATA *
// 形式参数:DATA *, char *
DATA *DeleteName(DATA *head, char *temp)
{
    DATA *p1 = head;
    DATA *p2 = head;
    DATA *p3 = head;

    if (NULL == p1)
    {
        printf("链表为空,无数据。\n");
    }
    else
    {        
        for(; p2 != NULL;)
        {
            if (strcmp(p2->name, temp) == 0)
            {
                if (p2 == p1)
                {
                    p1 = p1->next;
                    free(p2);
                    p2 = p1;
                    p3 = p2;
                }
                else
                {
                    p3->next = p2->next;
                    free(p2);
                    p2 = p3->next;
                }
                printf("数据名称为%s的结点已经从链表中删除。\n", temp);
            }// end if
            else
            {
                if (p2 == p1)
                {
                    p2 = p2->next;
                }
                else
                {
                    p3 = p2;
                    p2 = p2->next;
                }
            }// end else
        }// end for
        printf("链表已经排查完毕。\n");
    }
    return(p1);
}

// 函数名称:Insert
// 函数作用:根据结点score由小到大插入一个节点数据
// 创建时间:2014年3月21日1:57:53
// 返回值类型:DATA *
// 形式参数:DATA *, DATA *
DATA *Insert(DATA *head, DATA *temp)
{
    DATA *p1 = head;
    DATA *p2 = head;
    
    if (NULL == head)
    {
        head = temp;
        temp->next = NULL;
    }
    else
    {
        for (; (p1->score < temp->score) && (p1->next != NULL);)
        {
            p2 = p1;
            p1 = p1->next;
        }
        if (p1->score > temp->score)
        {
            if (p1 == head)
            {
                head = temp;
            }
            else
            {
                p2->next = temp;
            }
            temp->next = p1;
        }
        else
        {
            p1->next = temp;
            temp->next = NULL;
        }
    }
    printf("数据已插入。\n");
    return(head);
}

// 函数名称:Sort
// 函数作用:按照score从小到大排序
// 创建时间:2014年3月21日3:02:55
// 返回值类型:void
// 形式参数:DATA *
void Sort(DATA *head)
{
    DATA temp;
    DATA *p1 = head;
    DATA *p2 = NULL;
    DATA *p3 = &temp;

    if (NULL == p1)
    {
        printf("链表为空,无数据。\n");
    }
    else
    {
        for (; p1->next != NULL;)
        {
            p2 = p1->next;
            for (; p2 != NULL;)
            {
                if (p2->score < p1->score)
                {
                    p3->num = p1->num;
                    p1->num = p2->num;
                    p2->num = p3->num;

                    p3->score = p1->score;
                    p1->score = p2->score;
                    p2->score = p3->score;

                    strcpy(p3->name, p1->name);
                    strcpy(p1->name, p2->name);
                    strcpy(p2->name, p3->name);
                }
                p2 = p2->next;
            }// end for
            p1 = p1->next;
        }// end for
        printf("链表已经排序。\n");
    }// end else
}

// 函数名称:SortOpp
// 函数作用:将链表倒序排列
// 创建时间:2014年3月21日8:32:12
// 返回值类型:DATA *
// 形式参数:DATA *
DATA *SortOpp(DATA *head)
{
    DATA *p1 = head;
    DATA *p2 = NULL;
    DATA *p3 = NULL;

    if (NULL == p1)
    {
        printf("链表为空,无数据。\n");
        return(p1);
    }
    else if (NULL == p1->next)
    {
        printf("链表已倒序排列。\n");
        return(p1);
    }
    else
    {
        p2 = p1->next;
        p3 = p2->next;
        p1->next = NULL;
        p2->next = p1;
        for (; p3 != NULL;)
        {
            p1 = p2;
            p2 = p3;
            p3 = p3->next;
            p2->next = p1;
        }
        printf("链表已倒序排列。\n");
        return(p2);
    }
}

// 函数名称:Load
// 函数作用:根据文件名载入一个二进制文件数据并建立链表,返回链表头指针
// 创建时间:2014年3月27日21:38:12
// 返回值类型:DATA *
// 形式参数:char *
DATA *Load(char *fileName)
{
    FILE *fp = NULL;
    DATA *head = NULL;
    DATA temp;
    DATA *pt = &temp;
    DATA *p1 = NULL;
    DATA *p2 = NULL;
    int i = 1;

    if (NULL == (fp = fopen(fileName, "rb")))
    {
        printf("文件%s打开失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }
    if (fread(pt, LEN, 1, fp) != 1)
    {
        printf("文件%s读取失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }

    for (; feof(fp) == 0;) // 读取最后一个结点(尾结点)后,feof(fp)还是不等于0,然后就读取失败
    {
        p1 = (DATA *)malloc(LEN);
        *p1 = temp;
        printf("第%d个结点存入。\n", i++);
        if (NULL == head)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        if (fread(pt, LEN, 1, fp) != 1) 
        {
            
            if (feof(fp) == 1)
            {
                printf("文件%s读取结束。\n", fileName);
            }
            else
            {
                printf("文件%s读取失败。\n", fileName);
                printf("%-6d%-6s%-6d\n", pt->num, pt->name, pt->score);
            }
        }
    }
    fclose(fp);

    printf("文件%s数据读取成功,已建立链表。\n", fileName);
    return(head);
}

// 函数名称:LoadAscii
// 函数作用:根据文件名载入一个文本文件数据并建立链表,返回链表头指针
// 创建时间:2014年3月27日21:38:12
// 返回值类型:DATA *
// 形式参数:char *
DATA *LoadAscii(char *fileName)
{
    FILE *fp = NULL;
    DATA *head = NULL;
    DATA temp;
    DATA *pt = &temp;
    DATA *p1 = NULL;
    DATA *p2 = NULL;

    if (NULL == (fp = fopen(fileName, "r")))
    {
        printf("文件%s打开失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }
    if (fread(pt, LEN, 1, fp) != 1)
    {
        printf("文件%s读取失败。\n", fileName);
        fclose(fp);
        return(NULL);
    }

    for (; feof(fp) == 0;)
    {
        p1 = (DATA *)malloc(LEN);
        *p1 = temp;
        if (NULL == head)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        if (fread(pt, LEN, 1, fp) != 1) 
        {
            
            if (feof(fp) == 1)
            {
                printf("文件%s读取结束。\n", fileName);
            }
            else
            {
                printf("文件%s读取失败。\n", fileName);
                //printf("%-6d%-6s%-6d\n", pt->num, pt->name, pt->score);
            }
        }
    }
    fclose(fp);

    printf("文件%s数据读取成功,已建立链表。\n", fileName);
    return(head);
}

// 函数名称:Save
// 函数作用:把该头指针指向的链表数据依次存入该名称的二进制文件中
// 创建时间:2014年3月27日22:14:33
// 返回值类型:void
// 形式参数:DATA *, char *
void Save(DATA *head, char *fileName)
{
    FILE *fp = NULL;
    DATA *p = head;

    printf("数据开始存入:\n");
    if (NULL == (fp = fopen(fileName, "wb")))
    {
        printf("文件%s打开失败。\n", fileName);
        return;
    }
    for(;p != NULL;)
    {
        if (fwrite(p, LEN, 1, fp) != 1)
        {
            printf("数据写入失败。\n");
        }
        p = p->next;
    }
    fclose(fp);
    printf("链表数据存入文件%s成功\n", fileName);
}

// 函数名称:SaveAscii
// 函数作用:把该头指针指向的链表数据依次存入该名称的文本文件中
// 创建时间:2014年3月27日22:14:33
// 返回值类型:void
// 形式参数:DATA *, char *
void SaveAscii(DATA *head, char *fileName)
{
    FILE *fp = NULL;
    DATA *p = head;

    printf("数据开始存入:\n");
    if (NULL == (fp = fopen(fileName, "w")))
    {
        printf("文件%s打开失败。\n", fileName);
        return;
    }
    for(;p != NULL;)
    {
        if (fwrite(p, LEN, 1, fp) != 1)
        {
            printf("数据写入失败。\n");
        }
        p = p->next;
    }
    fclose(fp);
    printf("链表数据存入文件%s成功\n", fileName);
}

// 函数名称:main
// 函数作用:调用各被调函数,验证能否运行成功。
// 创建时间:2014年3月27日22:29:10
void main()
{
    char *fileName = "example.txt";
    char *a = "sort";
    DATA *head;
    DATA temp = {3, "sun", 3};
    DATA *p = &temp;
    
    //head = Creat();
    //Print(head);
    //Save(head, fileName);
    head = Load(a);
    Print(head);
    //Save(head, a);
    //head = SortOpp(head);
    //Print(head);
    //Sort(head);
    //Print(head);
    //head = SortOpp(head);
    //Print(head);
    //head = Delete(head, 2);
    //Print(head);
    //head = DeleteName(head, "yang");
    //Print(head);
    //head = Insert(head, p);
    //Print(head);
}
搜索更多相关主题的帖子: 二进制 文本文件 
2014-03-28 11:46
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

未知令人期待!
2014-03-28 11:47
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
再,,顶一下 不行就结贴,, 咋连个接分滴亲都木有呢。。

未知令人期待!
2014-03-28 22:53
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:30 
亲,这么长的代码一般人都懒的看啊。。。

想抽苏烟了。
2014-03-28 23:33
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 4楼 fl8962
我知道啊,其实问题只是最开始的那个代码,红色的是问题部分,函数都相对独立。我是怕大牛不清楚流程神马样子才贴的,后面对问题没啥实际用途。。 算啦,结贴了

未知令人期待!
2014-03-29 03:56
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
一般用条件: !feof(fp) 来测试文件的结束,你换一下试试。
2014-03-29 07:54
快速回复:关于fwrite,fread函数问题,最后怎么好像多东西了。。
数据加载中...
 
   



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

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