#include <string.h>
#define MAX_STUDENT_NUM 5 //学生个数
#define MAX_SCORE_NUM 3 //每个学生成绩个数
typedef struct student
{
char name[32]//姓名
int index //学号
int score[MAX_SCORE_NUM] //单项成绩数组
int avg_score//平均成绩
}STUDENT_T
//计算平均成绩
void average(STUDENT_T *a, int cnt)
{
int i = 0
int j = 0
for (i = 0 i < cnt i++)
{
for (j = 0 j < MAX_SCORE_NUM j++)
{
a[i].avg_score += a[i].score[j]
}
a[i].avg_score /= MAX_SCORE_NUM
}
}
void save(STUDENT_T *a, int cnt)
{
int i = 0
int j = 0
FILE *pf = NULL
char tmp_str[128] = {0}
char score_str[MAX_SCORE_NUM][32] = {0}
//打开文件 没有即创建有则覆盖写入
pf = fopen("./students.txt", "w+")
if (!pf)
{
printf("文件打开失败\n")
return
}
//先拼接字符串再通过fprintf写入文件
for (i = 0 i < cnt i++)
{
sprintf(tmp_str, "姓名:%s 学号:%d 平均成绩:%d", a[i].name, a[i].index, a[i].avg_score)
for (j = 0 j < MAX_SCORE_NUM j++)
{
sprintf(score_str[j], " 成绩%d:%d", j+1, a[i].score[j])
strcat(tmp_str, score_str[j])
}
fprintf(pf, "%s\n", tmp_str)
}
//关闭文件
fclose(pf)
}
int main(int argc, char *argv[])
{
int i = 0
int j = 0
int rank = 0
STUDENT_T student[MAX_STUDENT_NUM] = {0}
char tmp[32] = {0}
printf("请按序号依次输入%d个学生的信息\n", MAX_STUDENT_NUM)
for (i = 0 i < MAX_STUDENT_NUM i++)
{
printf("\n第%d个学生:\n", i+1)
printf("姓名:\n")
scanf("%s", student[i].name)
printf("学号:\n")
scanf("%d", &student[i].index)
for (j = 0 j < MAX_SCORE_NUM j++)
{
printf("第%d项成绩:\n", j+1)
scanf("%d", &student[i].score[j])
}
}
//计算每个学生的平均成绩
average(student, MAX_STUDENT_NUM)
//打印
for (i = 0 i < MAX_STUDENT_NUM i++)
{
printf("姓名:%s 学号:%d 平均成绩:%d\n", student[i].name, student[i].index, student[i].avg_score)
}
//保存到文件
save(student, MAX_STUDENT_NUM)
return 0
}
#include<stdio.h>
#include<malloc.h>
int main()
{
FILE* file = fopen("producer.out","r")
FILE* file2 = fopen("producer2.in","w")
char* buf=(char* )malloc(1<<20)
char* buf2=(char* )malloc(50)
int len
int poi=0
int sum=0
int i
while((len=fread(buf,1,1<<20,file))>0)
{
for(i=0i<len++i)
{
if(buf[i]!='0' &&buf[i]!='1')continue
sum*=2
sum+=buf[i]-'0'
++poi
if(poi==8)
{
printf("%c",(char)sum)
fprintf(file2,"%c",(char)sum)
poi=0
}
}
}
fclose(file)
fclose(file2)
free(buf)
free(buf2)
return 0
}
读了刚才的文件还原成123.
附上刚才的回答(从ASCII生成二进制)的文件读写版本:
#include<stdio.h>
#include<malloc.h>
int main()
{
FILE* file = fopen("producer.in","r")
FILE* file2 = fopen("producer.out","w")
char* buf=(char* )malloc(1<<20)
char* buf2=(char* )malloc(50)
int len
while((len=fread(buf,1,1<<20,file))>0)
{
int i
for(i=0i<len++i)
{
printf("%08s ",itoa((int)buf[i],buf2,2))
fprintf(file2,"%08s ",itoa((int)buf[i],buf2,2))
}
}
fclose(file)
fclose(file2)
free(buf)
free(buf2)
return 0
}
从123变成00110001 00110010 00110011 00001010 。
#include <stdio.h>#define JUDGER 5
#define PLAYER 3
void sort(float *player, int num)
{
for (int i=0 i<num i++)
for (int j=0 j<num-i-1 j++)
if (player[j]>player[j+1])
{
float tmp = player[j]
player[j] = player[j+1]
player[j+1] = tmp
}
printf("由高到低成绩排序: \n")
for (int i=0 i<num i++)
printf(" %f ", player[i])
}
void find(float grade[JUDGER][PLAYER], float player[PLAYER])
{
float max = 0
float min = 1000
int maxIndex = 0, minIndex = 0
for (int i=0 i<JUDGER i++)
{
float dis = 0
for (int j=0 j<PLAYER j++)
{
dis += grade[i][j] - player[j]
}
if (dis>max)
{ max = dis maxIndex = i}
if (dis<min)
{ min = dis minIndex = i}
}
printf("最公平的评委: %d号评委\n", minIndex)
printf("最不公平的评委: %d号评委\n", maxIndex)
}
void main()
{
float grade[JUDGER][PLAYER]
float player[PLAYER]
for (int i=0 i<PLAYER i++)
{
float sum = 0
float max = 0
float min = 100
printf("请输入第%d位选手的得分: ", i+1)
for (int j=0 j<JUDGER j++)
{
scanf("%f", &grade[j][i])
sum += grade[j][i]
if (grade[j][i]>max)
max = grade[j][i]
if (grade[j][i]<min)
min = grade[j][i]
}
player[i] = (sum - min - max) / (JUDGER - 2)
}
find(grade, player)
sort(player, PLAYER)
}