已排序的学生成绩文件进行插人处理。插人一个学生的3门课程成绩,程序先计算新插人学生的平均成绩,然后将它按成绩高低顺序插入,插入后不建立一个新文件。

#include<stdio.h>
#include<stdlib.h>struct Student {int number;char name[10];int score[3];float ave;
}stu[3], stue;
int main() {FILE* fp, * fp2;char string[100], c;int n = 0, t = 0;if ((fp = fopen("1.txt", "rb")) == NULL) {printf("未找到该文件");exit(0);}scanf("%d%s%d%d%d", &stue.number, stue.name, &stue.score[0], &stue.score[1], &stue.score[2]);stue.ave = (float)(stue.score[0] + stue.score[1] + stue.score[2]) / 3;for (int i = 0; (fscanf(fp, "%d%s%d%d%d%f", &stu[i].number, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].ave))!=0; i++) {        n++;printf("n:%d\n");}printf("n:%d\n", n);for (int j = 0; j < 3; j++) {if (stue.ave < stu[j].ave) {t++;}}if ((fp2 = fopen("1.txt", "w")) == NULL) {printf("未找到该文件");exit(0);}for (int i = 0; i < t; i++) {fprintf(fp2, "%d %s %d %d %d %f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);printf(" % d % s % d % d % d % f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);}fprintf(fp2, "%d %s %d %d %d %f\n", stue.number, stue.name, stue.score[0], stue.score[1], stue.score[2], stue.ave);printf(" % d % s % d % d % d % f\n", stue.number, stue.name, stue.score[0], stue.score[1], stue.score[2], stue.ave);for (int i = t; i < n; i++) {fprintf(fp2, "%d %s %d %d %d %f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);printf(" % d % s % d % d % d % f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);}
}

结果:死循环

原因:fscanf()并未读取到数据时的返回值不是0。

fread()返回值为实际读取到的文件内容的块数,到结尾返回0。

fscanf()则返回的是实际读取的数据个数,出错或者到结尾返回EOF。

修改后:

#include<stdio.h>
#include<stdlib.h>struct Student {int number;char name[10];int score[3];float ave;
}stu[3], stue;
int main() {FILE* fp, * fp2;char string[100], c;int n = 0, t = 0;if ((fp = fopen("1.txt", "rb")) == NULL) {printf("未找到该文件");exit(0);}scanf("%d%s%d%d%d", &stue.number, stue.name, &stue.score[0], &stue.score[1], &stue.score[2]);stue.ave = (float)(stue.score[0] + stue.score[1] + stue.score[2]) / 3;for (int i = 0; (fscanf(fp, "%d%s%d%d%d%f", &stu[i].number, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].ave)) !=EOF; i++) {n++;      }printf("n:%d\n", n);for (int j = 0; j < 3; j++) {if (stue.ave < stu[j].ave) {t++;}}if ((fp2 = fopen("1.txt", "w")) == NULL) {printf("未找到该文件");exit(0);}for (int i = 0; i < t; i++) {fprintf(fp2, "%d %s %d %d %d %f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);printf(" % d %s % d % d % d % f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);}fprintf(fp2, "%d %s %d %d %d %f\n", stue.number, stue.name, stue.score[0], stue.score[1], stue.score[2], stue.ave);printf(" % d %s % d % d % d % f\n", stue.number, stue.name, stue.score[0], stue.score[1], stue.score[2], stue.ave);for (int i = t; i < n; i++) {fprintf(fp2, "%d %s %d %d %d %f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);printf(" %d %s %d %d % d % f\n", stu[i].number, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);}
}

结果:

看书上的答案是fread(&stu[i],sizeof(struct Student),1,fp)!=0,就认为fscanf()并未读取到数据时的返回值是0,还是基础不够扎实。

C语言学习——fscanf()返回值相关推荐

  1. c语言函数返回值存储,C语言的函数返回值所存放的寄存器

    #include int add(int a, int b) { return a + b; } int asm_compare_one(int a) { _asm { mov edx, a cmp ...

  2. 易语言取linux命令返回值,易语言取程序返回值写法

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:易语言取程序返回值写法回答:在易语言中,程序包括"处理程序"都有六部分组成.一.程序名,就是程序的名称,程序名不 ...

  3. C语言库函数的返回值的一般规则

    C语言库函数的返回值的一般规则 一.常见函数举例 1.判断函数 正确为1,错误为0 比如C语言中判断是否到达文件结尾函数 int feof(FILE *filepointer) 1.到达文件尾部 1 ...

  4. r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解

    一. 简介 cat.print函数都是输出函数 > cat("hello world") hello world >> print("hello wor ...

  5. C语言主函数返回值含义

    上大学时候我学习C语言的时候主函数的类型还可以用void类型,毕业之后想再次加深一下编程的水平发现我找的编译器居然要求主函数必须具有int类型的返回值.简单的看了一点教程以及网络上的介绍之后,也不管三 ...

  6. c语言子函数返回值,C语言函数说明与返回值

    在学习C语言函数以前,我们需要了解什么是模块化程序设计方法. 人们在求解一个复杂问题时,通常采用的是逐步分解.分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解.程序员在 ...

  7. ABAP中接收.NET语言byte[]类型返回值问题

    在公司自开发的一个项目中,使用了.NET编写的视频监控控件.控件提供了CutBytePicture接口函数用于截取视频图片,返回图片字节流..NET函数原型如下: public byte[] CutB ...

  8. c语言规定 函数返回值6,C语言六函数.ppt

    C语言六函数 第六章 函数 任何一个结构化程序都可以由三种基本结构组成:顺序结构.选择结构和循环结构,为了利用这三种结构编写结构化程序,通常需要采用自顶向下.逐步细化和模块化的程序设计方法,这也就是说 ...

  9. C语言return的返回值问题(字符串)

    文章目录 前 总结 前言 近日在完成作业时,发现了关于return返回字符的问题 话不多说,直接上超简单实例 #include <stdio.h> char game() {if (1)r ...

最新文章

  1. 【响应式Web前端设计】CSS3 :nth-of-type() 选择器
  2. 阿里云发布飞天专有云敏捷版 支持Docker企业版
  3. mysql 创建表_MySQL创建表(十一)
  4. php str_replace多个参数,php str_replace()函数的用法,有那些参数?
  5. ABAP并发编程到底能提高多少性能
  6. 使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性
  7. 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
  8. java洗扑克牌算法分析_IT兄弟连 Java语法教程 综合案例
  9. mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解
  10. 电脑重启 硬件问题引发的人品问题
  11. 美国商务部发布软件物料清单 (SBOM) 的最小元素(中)
  12. Mac苹果Time Machine 备份速度太慢的解决方法!
  13. 区块链发展迎来新机遇
  14. 利用PLTS从F域Export出T域数据指南
  15. 链表实现一元多项式的加法、乘法、求导,求值
  16. 遥远的路:【码农】的成长困惑
  17. 路由器与交换机工作过程详解!!!
  18. java唯一订单号_java高并发下唯一订单号生成器【16位数字订单号】
  19. Mackdown 编辑器-马克飞象
  20. fwr310刷openwrt_迅捷FWR310无线路由器的刷机

热门文章

  1. ckc交易什么意思_股前加r是什么意思?股市kdj线图如何看?
  2. BART中文摘要生成,(nplcc与LCSTS数据集)
  3. C#开发WPS插件入门
  4. 弹性计算产品专家张新涛:阿里云视觉计算的思考与实践
  5. 设计模式----装饰模式
  6. 《数据结构》实验报告三:栈 队列
  7. 查看电脑支持最大内存和内存条型号
  8. 虚拟化技术 - 概览 [一]
  9. 芯片IC测试专栏—ESD与TLP
  10. 家谱世表怎么写?4个要点不注意,会让人贻笑大方的