《C语言程序开发范例宝典-2015-杨丽》-实例170-成块读写操作
发表在C语言图书答疑 2017-09-25 《C语言从入门到精通(第3版)》第14章 文件
是否精华
版块置顶:

main函数中,save函数所在的位置是错了吗?本来save函数是读入n个学生的名字、编号和各科成绩;为什么放在循环里面!见下面代码加粗部分。

#include <stdio.h>

#include<stdlib.h>

struct student_score /*定义结构体存储学生成绩信息*/

{

    char name[10];

    int num;

    int China;

    int Math;

    int English;

} score[100];

void save(char *name, int n) /*自定义函数save*/

{

    FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/

    int i;

    if ((fp = fopen(name, "wb")) == NULL) /*以只写方式打开指定文件*/

    {

        printf("cannot open file\n");

        exit(0);

    }

    for (i = 0; i < n; i++)

        if (fwrite(&score[i], sizeof(struct student_score), 1, fp) != 1) /*将一组数据输出到fp所指的文件中*/

            printf("file write error\n"); /*如果写入文件不成功,则输出错误*/

    fclose(fp); /*关闭文件*/

}

void show(char *name, int n) /*自定义函数show*/

{

    int i;

    FILE *fp; /*定义一个指向FILE类型结构体的指针变量*/

    if ((fp = fopen(name, "rb")) == NULL) /*以只读方式打开指定文件*/

    {

        printf("cannot open file\n");

        exit(0);

    } for (i = 0; i < n; i++)

    {

        fread(&score[i], sizeof(struct student_score), 1, fp); /*从fp所指向的文件读入数据存到数组score中*/

        printf("%-10s%4d%4d%4d%4d\n", score[i].name, score[i].num,

            score[i].China, score[i].Math, score[i].English);

    }

    fclose(fp); /*以只写方式打开指定文件*/

}

main()

{

    int i, n; /*变量类型为基本整型*/

    char filename[50]; /*数组为字符型*/

    printf("how many students in your class?\n");

    scanf("%d", &n); /*输入学生数*/

    printf("please input filename:\n");

    scanf("%s", filename); /*输入文件所在路径及名称*/

    printf("please input name,number,China,math,English:\n");

    for (i = 0; i < n; i++) /*输入学生成绩信息*/

    {

        printf("NO%d", i + 1);

        scanf("%s%d%d%d%d", score[i].name, &score[i].num, &score[i].China,

            &score[i].Math, &score[i].English);

        save(filename, n); /*调用函数save*/

    } show(filename, n);/*调用函数show*/

}


分享到:
精彩评论 4
大米粥
学分:1330 LV8
TA的每日心情
伤心
2017-05-02 10:51:31
2017-09-27
沙发

save()函数的位置没有错,需要放在循环里面,因为是要将输入的学生信息循环的写入到文件中。

zer0_1499414293
学分:77 LV3
2017-09-27
板凳

大米粥 发表于2017-09-27 16:30

save()函数的位置没有错,需要放在循环里面,因为是要将输入的学生信息循环的写入到文件中。

还是不对,循环写入n个学生的信息,main函数里是save(filename, n);那为什么每写入一个学生的成绩,调用save函数的时候要写入n次,是为了防止写入失败吗?还是印刷错误,main函数里应该是save(filename, 1);??

大米粥
学分:1330 LV8
TA的每日心情
伤心
2017-05-02 10:51:31
2017-09-30
地板

没有错,如果按你说的,save函数的第二个参数是1,那你看save()函数的定义,那就不对了。

zer0_1499414293
学分:77 LV3
2017-09-30
4L

教程就是错了,老师看如下调试界面,我写入学生的成绩,为什么每次都要循环5遍,录入后面学生的成绩也要把前面的学生的成绩重录一遍吗?哎,不是嘛!!!

实例170调试.png


若是按我的思路把save()函数放for循环外面,逻辑是对的,就是不知道为什么存储的是乱码!!!PS:又发现教程的一个错误,哈哈!

正确的程序结构应该是这样的,坚信自己是对的,

实例170修正.png

。。。无语了

首页上一页 1 下一页尾页 4 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照