任务1
1 #include<stdio.h> 2 #define N 80 3 #define M 100 4 5 typedef struct{ 6 char name[N]; 7 char author[N]; 8 }Book; 9 10 void write(); 11 void read(); 12 13 int main(){ 14 printf("测试1:把图书信息写入文本文件\n"); 15 write(); 16 17 printf("\n测试2:从文本文件读取图书信息,打印输出到屏幕\n"); 18 read(); 19 20 return 0; 21 22 } 23 24 void write(){ 25 Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"}, 26 {"《灯塔》", "克里斯多夫.夏布特"}, 27 {"《人的局限性》", "塞缪尔.约翰生"}, 28 {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"}, 29 {"《大地之上》", "罗欣顿·米斯特里"}, 30 {"《上学记》", "何兆武"}, 31 {"《命运》", "蔡崇达"} }; 32 int n,i; 33 FILE *fp; 34 n=sizeof(x)/sizeof(x[0]); 35 36 fp=fopen("datal.txt","w"); 37 38 if(fp==NULL){ 39 printf("fail to open file to write\n"); 40 return; 41 } 42 43 for(i=0;i<n;i++) 44 fprintf(fp,"%-40s%-20s\n",x[i].name ,x[i].author ); 45 46 fclose(fp); 47 48 } 49 50 void read(){ 51 Book x[M]; 52 int i,n; 53 int number; 54 55 FILE *fp; 56 57 fp=fopen("datal.txt","r"); 58 59 if(fp == NULL) { 60 printf("fail to open file to read\n"); 61 return; 62 } 63 64 i=0; 65 while(!feof(fp)){ 66 number = fscanf(fp, "%s%s", x[i].name, x[i].author); 67 if(number != 2) 68 break; 69 i++; 70 } 71 n=i; 72 73 for(i=0;i<n;++i) 74 printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author); 75 76 fclose(fp); 77 }
去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资 料,分析这两行代码放在这里起到什么作用:删除之后就会再生成一行空行。如果fscanf没有正常读取到两串字符,比如格式错误或者已经到达文件末尾,就跳出循环
任务2
#include<stdio.h> #define N 80 #define M 100 typedef struct { char name[N]; char author[N]; } Book; void write(); void read(); int main() { printf("测试1: 把图书信息以数据块方式写入二进制文件\n"); write(); printf("\n测试2: 从二进制文件读取图书信息, 打印输出到屏幕\n"); read(); return 0; } void write(){ Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"}, {"《灯塔》", "克里斯多夫.夏布特"}, {"《人的局限性》", "塞缪尔.约翰生"}, {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"}, {"《大地之上》", "罗欣顿·米斯特里"}, {"《上学记》", "何兆武"}, {"《命运》", "蔡崇达"} }; int n; FILE *fp; n=sizeof(x)/sizeof(x[0]); fp=fopen("data2.dat","wb"); if(fp==NULL){ printf("fail to open file to write\n"); return; } fwrite(x,sizeof(Book),n,fp); fclose(fp); } void read(){ Book x[M]; int i,n; int number; FILE *fp; fp=fopen("data2.dat","rb"); if(fp==NULL){ printf("fail to open file to read\n"); return; } i=0; while(!feof(fp)){ number=fread(&x[i],sizeof(Book),1,fp); if(number!=1) break; i++; } n=i; for(i=0;i<n;i++) printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author); fclose(fp); }
去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资料,分析这两行代码放在这里起到什么作用:删除之后就会再生成一行空行。如果fscanf没有正常读取到一个book结构体,比如格式错误或者已经到达文件末尾,就跳出循环
任务三
1 // 文件读写操作:以字符、字符串形式读、写 2 3 #include <stdio.h> 4 #define N 5 5 #define M 80 6 7 void write(); 8 void read_str(); 9 void read_char(); 10 11 int main() { 12 printf("测试1: 把一组字符信息以字符串方式写入文本文件\n"); 13 write(); 14 15 printf("\n测试2: 从文件以字符串方式读取, 输出到屏幕\n"); 16 read_str(); 17 18 printf("\n测试3: 从文件以单个字符方式读取, 输出到屏幕\n"); 19 read_char(); 20 21 return 0; 22 } 23 24 void write() { 25 char *ptr[N] = { "Working\'s Blues", 26 "Everything Will Flow", 27 "Streets of London", 28 "Perfect Day", 29 "Philadelphia"}; 30 int i; 31 FILE *fp; 32 33 fp = fopen("data3.txt", "w"); 34 if(!fp) { 35 printf("fail to open file to write\n"); 36 return; 37 } 38 39 for(i = 0; i < N; ++i) { 40 fputs(ptr[i], fp); 41 fputs("\n", fp); 42 } 43 44 fclose(fp); 45 } 46 47 void read_str() { 48 char songs[N][M]; 49 int i; 50 FILE *fp; 51 52 fp = fopen("data3.txt", "r"); 53 if(!fp) { 54 printf("fail to open file to read\n"); 55 return; 56 } 57 58 for(i = 0; i < N; ++i) 59 fgets(songs[i], 80, fp); 60 61 for(i = 0; i < N; ++i) 62 printf("%d. %s", i+1, songs[i]); 63 64 fclose(fp); 65 } 66 67 void read_char() { 68 char ch; 69 FILE *fp; 70 71 fp = fopen("data3.txt", "r"); 72 if(!fp) { 73 printf("fail to open file to read\n"); 74 return; 75 } 76 77 while(!feof(fp)) { 78 ch = fgetc(fp); 79 if(ch == EOF) 80 break; 81 82 putchar(ch); 83 } 84 85 fclose(fp); 86 }
代码line25字符串 “Working\’s Blues”输出时为什么没有显示反斜杠\:fgets函数不录入\
任务4
#include<stdio.h> #include<string.h> #define N 100 #define M 80 void read(); int main(){ printf("data4.txt统计结果:\n"); read(); return 0; } void read(){ int i,n,j,sum=0; char x[N][M]; int number; FILE *fp; fp = fopen("data4.txt", "r"); if(fp==NULL){ printf("fail to open file to read\n"); return; } i=0; while(!feof(fp)){ fgets(x[i], 80, fp); i++;} printf("行数:%d\n",i); for(j=0;j<i;j++) { n=strlen(x[j]); for(int k=0;k<n;k++) if(x[j][k]!=' ' && x[j][k]!='\n')sum++; } printf("字符数:%d\n",sum); fclose(fp); }
任务5
#include <stdio.h> #include <string.h> #define N 10 typedef struct { long id; // 准考证号 char name[20]; // 姓名 float objective; // 客观题得分 float subjective; // 操作题得分 float sum; // 总分 char result[10]; // 考试结果 } STU; // 函数声明 void read(STU st[], int n); void write(STU st[], int n); void output(STU st[], int n); int process(STU st[], int n, STU st_pass[]); int main() { STU stu[N], stu_pass[N]; int cnt; double pass_rate; printf("从文件读入%d个考生信息...\n", N); read(stu, N); printf("\n对考生成绩进行统计...\n"); cnt = process(stu, N, stu_pass); printf("\n通过考试的名单:\n"); output(stu, N); // 输出所有考生完整信息到屏幕 write(stu_pass, N); // 输出考试通过的考生信息到文件 pass_rate = 1.0 * cnt / N; printf("\n本次等级考试通过率: %.2f%%\n", pass_rate*100); return 0; } // 把所有考生完整信息输出到屏幕上 // 准考证号,姓名,客观题得分,操作题得分,总分,结果 void output(STU st[], int n) { int i; printf("准考证号\t姓名\t客观题得分\t操作题得分\t总分\t\t结果\n"); for (i = 0; i < n; i++) printf("%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", st[i].id, st[i].name, st[i].objective, st[i].subjective, st[i].sum, st[i].result); } // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分 void read(STU st[], int n) { int i,result; FILE *fp; fp = fopen("examinee.txt", "r"); if (!fp) { printf("fail to open file\n"); return; } while (!feof(fp)) { for (i = 0; i < n; i++) result=fscanf(fp, "%ld %s %f %f", &st[i].id, st[i].name, &st[i].objective, &st[i].subjective); if(result!=4){ break; } } fclose(fp); } // 把通过考试的考生完整信息写入文件list_pass.txt // 准考证号,姓名,客观题得分,操作题得分,总分,结果 void write(STU s[], int n) { int i; FILE *fin; fin=fopen("list_pass.txt","w"); if(!fin){ printf("fail to open file\n"); return; } for(i=0;i<n;i++){ fprintf(fin,"%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].result); } fclose(fin); } // 对考生信息进行处理:计算每位考生考试总分、结果;统计考试通过的人数 int process(STU st[], int n, STU st_pass[]) { int i,cnt=0; for(i=0;i<n;i++){ st[i].sum=st[i].objective+st[i].subjective; if(st[i].sum>=60){ strcpy(st[i].result, "通过"); st_pass[cnt++] = st[i];} else{ strcpy(st[i].result, "不通过"); } } return cnt; }
任务6
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 #define N 80 6 7 typedef struct { 8 long id; // 准考证号 9 char name[20]; // 姓名 10 char cla[40]; // 考试结果 11 } STU; 12 13 void write(STU st[],int n); 14 void read(STU st[],int n); 15 void output(STU st[], int n); 16 void process(STU st[],STU stu[],int n); 17 18 int main(){ 19 STU st[N],stu[N]; 20 21 22 read(st,N); 23 printf("随机抽取五个人的名单\n"); 24 25 process (st,stu,N); 26 27 output(stu,5); 28 write(stu,5); 29 printf("保存到文件\n输入文件名:20241000.txt\n保存成功"); 30 return 0; 31 } 32 33 void output(STU st[], int n) { 34 int i; 35 36 for (i = 0; i < n; i++) 37 printf("%ld\t\t%s\t%s\n", st[i].id, st[i].name,st[i].cla); 38 } 39 40 41 void read(STU st[],int n){ 42 int i,result; 43 FILE *fp; 44 45 fp=fopen("list.txt","r"); 46 if (!fp) { 47 printf("fail to open file\n"); 48 return; 49 } 50 51 for (i = 0; i < n; i++){ 52 53 result=fscanf(fp, "%ld %s %s", &st[i].id, st[i].name, st[i].cla); 54 if(result!=3){ 55 break; 56 }} 57 58 59 fclose(fp); 60 } 61 62 63 64 void write(STU st[], int n){ 65 int i; 66 FILE *fp; 67 68 fp = fopen("20241000.txt", "w"); 69 if (!fp) { 70 printf("fail to open file\n"); 71 return; 72 } 73 74 for (i = 0; i < n; i++) { 75 fprintf(fp, "%ld %s %s\n", st[i].id, st[i].name, st[i].cla); 76 } 77 78 fclose(fp); 79 80 } 81 82 void process(STU st[],STU stu[],int n){ 83 int i,count=0; 84 srand(time(NULL)); 85 while (count < 5) { 86 int index = rand() % n; 87 if (stu[index].id == 0 || stu[index].id == st[index].id) { 88 stu[count++] = st[index]; 89 } 90 } 91 }
来源链接:https://www.cnblogs.com/shansuiqu/p/18639762
没有回复内容