// 从文本文件file1.dat中读取数据,找出最高分和最低分学生信息,并输出在屏幕上
#include <stdio.h>
#include <stdlib.h>
#define N 10
// 定义一个结构体类型STU
typedef struct student {
int num;
char name[20];
int score;
}STU;
int main() {
STU st, stmax, stmin;
int i;
FILE *fp;
// 以只读文本方式打开文件file1.dat
fp = fopen("file1.dat", "r");
if( !fp ) { // 如果打开失败,则输出错误提示信息,然后退出程序
printf("fail to open file1.dat\n");
exit(0);
}
stmax.score = 0; // 先假定最高分是0,后面如发现比当前最高分还高的分数,就更新最高分
stmin.score = 100; // 先假定最低分是100分,后面如发现比当前最低分更低的分数,就更新最低分
for(i=0; i<N; i++) {
fscanf(fp, "%d %s %d", &st.num, st.name, &st.score); // 从fp指定的文件中格式化读取一个学生信息
if(st.score > stmax.score)
stmax = st;
else if(st.score < stmin.score)
stmin = st;
}
fclose(fp);
printf("最高分学生信息: %5d%15s%5d\n", stmax.num, stmax.name, stmax.score);
printf("最低分学生信息: %5d%15s%5d\n", stmin.num, stmin.name, stmin.score);
system("pause");
return 0;
}
// 这是《C语言程序设计教程学习指导》「2.10 文件」中的实验,细微处做了微调
// 这个源代码没有考虑多个高分或多个低分的情形。


// 从文本数据文件file1.dat中读入数据,按成绩从高到低排序,并将排序结果输出到屏幕上,同时,也以二进制方式存入文件file4.dat中。
#include <stdio.h>
#include <stdlib.h>
#define N 10
// 定义一个结构体类型STU
typedef struct student {
int num;
char name[20];
int score;
}STU;
void sort(STU *pst, int n); // 函数声明
int main() {
FILE *fin, *fout;
STU st[N];
int i;
// 以只读文本方式打开文件file1.dat
fin = fopen("d:\\文件\\file1.dat", "r");
if( !fin ) { // 如果打开失败,则输出错误提示信息,然后退出程序
printf("fail to open file1.dat\n");
exit(0);
}
// 从fin指向的数据文件file1.dat中读取数据到结构体数组st
for(i=0; i<N; i++)
fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);
fclose(fin); // 关闭fin指向的文件file1.dat
// 调用函数sort()对数组st中数据,按分数由高到低排序
sort(st, N);
// 以写方式打开/创建二进制文件file4.dat
fout = fopen("d:\\文件\\file4.dat", "wb");
if( !fout ) { // 如果打开失败,则输出错误提示信息,然后退出程序
printf("fail to open file1.dat\n");
exit(0);
}
// 将排序后的数组st中数据输出到屏幕
for(i=0; i<N; i++)
printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
// 将排序后的数组st中数据写到二进制文件file4.dat
fwrite(st, sizeof(STU), N, fout); // 将从地址st开始的sizeof(STU)×N个字节信息写入fout指向的文件file4.dat中
fclose(fout); // 关闭fout指向的文件file4.dat
system("pause");
return 0;
}
// 函数功能描述:对pst指向的n个STU结构体数据进行排序,按成绩数据项由高到底排序
// 排序算法:冒泡法
void sort(STU *pst, int n) {
STU *pi, *pj, t;
for(pi = pst; pi < pst+n-1; pi++)
for(pj = pi+1; pj < pst+n; pj++)
if(pi->score < pj->score) {
t = *pi;
*pi = *pj;
*pj = t;
}
}
// 说明:冒泡排序算法是确定的,但其具体实现方式和细节却是灵活多样的
// 本例中,冒泡排序算法的函数体中,都是通过指针变量操作的。
// 而在前面章节的实例中,冒泡排序的函数体,有些是通过数组实现的,有些是指针和数组的混合
// 请结合代码体会和理解,做到理解算法本质,才能应对和理解灵活多样的实现形式

原文:https://www.cnblogs.com/qyyyyyyd/p/12128232.html