bywfssl 2017-08-05 07:42 采纳率: 100%
浏览 781

下面这段代码的执行流程有一处疑问,请各位看看

 #include <stdio.h>
#include<process.h>
struct address_list                     /*定义结构体存储学生成绩信息*/
{
    char name[10];
    char adr[20];
    char tel[15];
} info[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++)
       //将一组数据输出到fp所指的文件中
        if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)
            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(&info[i], 
    sizeof(struct address_list), 1, fp); /*从fp所指向的文件读入数据存到数组score中*/
        printf("%15s%20s%20s\n", info[i].name, info[i].adr,info[i].tel);
    }
    fclose(fp);                         /*以只写方式打开指定文件*/
}
main()
{
    int i, n;                               /*变量类型为基本整型*/
    char filename[50];                  /*数组为字符型*/
    printf("有多少个学生?\n");
    scanf("%d", &n);                        /*输入学生数*/
    printf("请输入文件路径及名称:\n");
    scanf("%s", filename);              /*输入文件所在路径及名称*/
    printf("请输入学生的姓名、地址、电话:\n");
    for (i = 0; i < n; i++)             /*输入学生成绩信息*/
    {
        printf("NO%d\n", i + 1);
        scanf("%s%s%s", info[i].name, info[i].adr, info[i].tel);
        save(filename, n);                  /*调用函数save*/
    }
    show(filename, n);                  /*调用函数show*/
    return 0;
}

从main函数处开始执行,输入n=4(即4个学生),在输出“请输入学生的姓名、地址、电话”这句后,第一次进入for循环,此时从键盘上输入一个学生的全部信息后按Enter键,开始调用save函数,此时在save函数中进入for循环后n是4,执行 if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)这句后把info[0]的信息写入到文件中了对吧?接着save函数中for语句进入第二次循环,这个时候info[1]的值还没输入呢,再判断 if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1)这句的判定不会出错吗?即使不出错,此时程序把谁写入了文件呢?如果打开文件看的话,其实文件中只有info[0]的信息,没有另外三个结构变量的信息啊?求解释

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-08-05 16:49
    关注

    save(filename, n); 不用放在循环里,而是放在循环外面,一次性存储就可以了。

    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R