| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1218 人关注过本帖
标题:[元旦散分] 文件读写代码
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:16 
[元旦散分] 文件读写代码
之前贴的那个因照顾有人可能用旧式编译器,使用了不安全的函数,现在换用安全函数,并加上返回错误代码,让调用者有更大的可控性。

不多作解释,只要阅读者看得到修改结构体结构、数组尺寸之类是否需要改读写函数,以及如果用链表作数据结构则读写函数要作什么改动即可。

解释一下程序的动作:
1.初始化两条记录的数据,写入到文件中。
2.在内存中修改原先两条记录中的第一条记录的数据。
3.从文件中读入一条记录追加到当前数据的末尾,令数组成为三条记录。
4.在屏幕输出这三条记录,确认再读出来的肯定不是留在内存中的原数据,而是的确从文件中读回来的。
5.注意:a.文件读写函数没有与数据结构密切相关的代码,随便修改结构体也不会有影响,唯一有影响的,是如何递增记录,数组和链表是不一样的;b.采用字符串cz模式使用结构体数组,即有结束标志,无需传递有效元素个数。

程序代码:
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>

typedef struct _student
{
    char  clas[20];            /*班级*/
    int   number;            /*学号*/
    char  name[20];            /*姓名*/
    float clan;                /*C语言成绩*/
    float english;            /*大学英语成绩*/
    float math;                /*高等数学成绩*/
    float sum;                /*总分*/
    float adver;            /*平均分*/
} Student;

const char fileName[] = "Students.DAT";

errno_t SaveData(Student* stu);
errno_t LoadData(Student* stu, int number);
void ShowData(Student* stu);

void main(void)
{
    Student stu[50] = {
        { "中文10(1)", 1, "张三丰", 80.5, 70.0, 92.5 },
        { "中文10(1)", 2, "丘处机", 77.0, 60.0, 95.0 },
        { NULL }
    };

    SaveData(stu);
    strcpy_s(stu[0].clas, sizeof(stu[0].clas) / sizeof(char) - 1, "中文10(2)");
    strcpy_s(stu[0].name, sizeof(stu[0].name) / sizeof(char) - 1, "梅超风");
    stu[0].clan = 60.5;
    stu[0].english = 74.0;
    stu[0].math = 80.0;
    LoadData(&stu[2], 1);
    ShowData(stu);

    _getch();
}

errno_t SaveData(Student* stu)
{
    FILE* file;
    errno_t err;
   
    if (!(err = fopen_s(&file, fileName, "wb")))
    {
        while (*stu->clas)
        {
            fwrite((void *)stu, sizeof(*stu), 1, file);
            ++stu;
        }
        fclose(file);
    }

    return err;
}

errno_t LoadData(Student* stu, int number)
{
    FILE* file;
    errno_t err;

    if (!(err = fopen_s(&file, fileName, "rb")))
    {
        while (!feof(file) && number--)
        {
            fread(stu, sizeof(*stu), 1, file);
            ++stu;
        }
        fclose(file);
        *stu->clas = NULL;
    }

    return err;
}

void ShowData(Student* stu)
{
    while (*stu->clas)
    {
        printf("班级: %-20s\n", stu->clas);
        printf("学号: %04d\n", stu->number);
        printf("姓名: %-20s\n", stu->name);
        printf("C语言: %6.2f\n", stu->clan);
        printf("英语: %6.2f\n", stu->english);
        printf("高数: %6.2f\n", stu->math);
        printf("\n");
        ++stu;
    }
}


[ 本帖最后由 TonyDeng 于 2011-12-31 15:34 编辑 ]
搜索更多相关主题的帖子: 记录 安全 编译器 结构体 阅读者 
2011-12-31 14:40
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:11 
我接分来了,哈哈。
要兼顾旧式编译器呀。

我们都在路上。。。。。
2011-12-31 15:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
带_s后缀的,很容易改回旧式函数。原先贴的那个代码就用的strcpy()、fopen()函数。

授人以渔,不授人以鱼。
2011-12-31 15:06
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
做个条件编译吧,要不新手总是编译不来。

我们都在路上。。。。。
2011-12-31 15:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用hellovfp在2011-12-31 15:07:06的发言:

做个条件编译吧,要不新手总是编译不来。

你给加上去?给你多点分嘛~

授人以渔,不授人以鱼。
2011-12-31 15:10
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:11 
接分了

我的地盘
2011-12-31 15:20
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:11 
很详细,接分

为游戏狂~~!!    大家努力编哈!
2011-12-31 18:23
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:11 
果断接分!

人得一生得奋斗!
2011-12-31 18:37
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:11 
接分

最基础的往往是你最容易忽略的!
2011-12-31 18:51
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:11 
Tony的帖子得顶一下

总有那身价贱的人给作业贴回复完整的代码
2011-12-31 19:08
快速回复:[元旦散分] 文件读写代码
数据加载中...
 
   



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

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