实验七

实验任务1

源代码

点击查看代码
// 文件读写操作:格式化读、写文本文件
#include <stdio.h>
#include <windows.h>

#define N 80
#define M 100

typedef struct {
    char name[N];       // 书名
    char author[N];     // 作者
} Book;

void write();
void read();

int main() {
	system("chcp 65001");
    printf("测试1: 把图书信息写入文本文件\n");
    write();

    printf("\n测试2: 从文本文件读取图书信息, 打印输出到屏幕\n");
    read();

    return 0;
}

void write() {
    Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"},
                  {"《灯塔》", "克里斯多夫.夏布特"},
	              {"《人的局限性》", "塞缪尔.约翰生"}, 
				  {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"},
				  {"《大地之上》", "罗欣顿·米斯特里"}, 
                  {"《上学记》", "何兆武"}, 
                  {"《命运》", "蔡崇达"} };
    int n, i;
	FILE *fp;

    // 计算数组x中元素个数
    n = sizeof(x) / sizeof(x[0]);       
	
	// 以写的方式打开文本文件data1.txt 
	fp = fopen("data1.txt", "w");
	
	// 如果打开文件失败,输出提示信息并返回 
	if(fp == NULL) {
		printf("fail to open file to write\n");
		return;
	}
	
	// 将结构体数组x中的图书信息格式化写到fp指向的文件data1.txt
	for(i = 0; i < n; ++i)
		fprintf(fp, "%-40s %-20s\n", x[i].name, x[i].author);
	
	fclose(fp);
}

void read() {
    Book x[M]; 
	int i, n;
	
	FILE *fp;
	
	// 以读的方式打开文本文件data1.txt 
	fp = fopen("data1.txt", "r");
	
	// 如果打开文件失败,输出提示信息并返回 
	if(fp == NULL) {
		printf("fail to open file to read\n");
		return;
	}
	
    // 从文件中读取图书信息,保存到结构体数组x中
    i = 0;
	while(fscanf(fp, "%s%s", x[i].name, x[i].author) != EOF) 
        ++i;
	
    // 将图书信息打印输出到屏幕上
	n = i;
    for(i = 0; i < n; ++i)
        printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author);
	
	fclose(fp);
}

实验结果

image

image

实验任务2

源代码

点击查看代码
// 文件读写操作:以数据块方式读、写二进制文件

#include <stdio.h>
#include <windows.h>

#define N 80
#define M 100

typedef struct {
    char name[N];       // 书名
    char author[N];     // 作者
} Book;

void write();
void read();

int main() {
    system("chcp 65001");
    printf("测试1: 把图书信息以数据块方式写入二进制文件\n");
    write();

    printf("\n测试2: 从二进制文件读取图书信息, 打印输出到屏幕\n");
    read();

    return 0;
}

void write() {
    Book x[] = { {"《雕塑家》", "斯科特.麦克劳德"},
                  {"《灯塔》", "克里斯多夫.夏布特"},
	              {"《人的局限性》", "塞缪尔.约翰生"}, 
				  {"《永不停步:玛格丽特.阿特伍德传》", "罗斯玛丽.沙利文"},
				  {"《大地之上》", "罗欣顿·米斯特里"}, 
                  {"《上学记》", "何兆武"}, 
                  {"《命运》", "蔡崇达"} };
    int n, i;
	FILE *fp;

    // 计算数组x中元素个数
    n = sizeof(x) / sizeof(x[0]);     
	
	// 以写的方式打开二进制文件data2.dat
	fp = fopen("data2.dat", "wb");
	
	// 如果打开文件失败,输出提示信息并返回 
	if(fp == NULL) {
		printf("fail to open file to write\n");
		return;
	}
	
	// 将结构体数组x中的图书信息以数据块方式写入二进制文件data2.dat
    fwrite(x, sizeof(Book), n, fp);
	
	fclose(fp);
}

void read() {
    Book x[M]; 
	int i, n;
	
	FILE *fp;
	
	// 以读的方式打开二进制文件data2.dat
    fp = fopen("data2.dat", "rb");
	
	// 如果打开文件失败,输出提示信息并返回 
	if(fp == NULL) {
		printf("fail to open file to read\n");
		return;
	}
	
    // 从二进制文件data2.dat以数据块方式读取图书信息存储到结构体数组x
    i = 0;
    while(fread(&x[i], sizeof(Book), 1, fp) == 1) 
        ++i;

    // 在屏幕上打印输出
    n = i;
    for(i = 0; i < n; ++i)
        printf("%d. %-40s%-20s\n", i+1, x[i].name, x[i].author);
    
	fclose(fp);
}

实验结果

image

image

实验任务3

源代码

点击查看代码
// 文件读写操作:以字符、字符串形式读、写

#include <stdio.h>
#include <windows.h>
#define N 100
#define M 80

void write();
void read_str();
void read_char();

int main() {
    system("chcp 65001");
    printf("测试1: 把一组字符信息以字符串方式写入文本文件\n");
    write();

    printf("\n测试2: 从文件以字符串方式读取, 输出到屏幕\n");
    read_str();

    printf("\n测试3: 从文件以单个字符方式读取, 输出到屏幕\n");
    read_char();

    return 0;
}

void write() {
    char *ptr[] = { "Working\'s Blues",
                     "Everything Will Flow",
                     "Streets of London",
                     "Perfect Day",
                     "Philadelphia"};
    int i, n;
    FILE *fp;

    fp = fopen("data3.txt", "w");
    if(fp == NULL) {
        printf("fail to open file to write\n");
        return;
    }

    n = sizeof(ptr)/sizeof(ptr[0]);

    for(i = 0; i < n; ++i) {
        fputs(ptr[i], fp);
        fputs("\n", fp);
    }
    
    fclose(fp);
}

void read_str() {
    char songs[N][M];
    int i, n;
    FILE *fp;

    fp = fopen("data3.txt", "r");
    if(fp == NULL) {
        printf("fail to open file to read\n");
        return;
    }

    i = 0;
    while(i < N && (fgets(songs[i], M, fp) != NULL))
        ++i;

    n = i;
    for(i = 0; i < n; ++i)
        printf("%d. %s", i+1, songs[i]);
    
    fclose(fp);
}

void read_char() {
    int ch;
    FILE *fp;

    fp = fopen("data3.txt", "r");
    if(fp == NULL) {
        printf("fail to open file to read\n");
        return;
    }

    while((ch = fgetc(fp)) != EOF)
        putchar(ch);

    fclose(fp);
}

实验结果

image

image

思考

*1.\反斜杠是转义字符在这个代码里面'就是'的意思
*2.只读取前100行的代码 防止信息泄露或者读取的太多 导致崩了

实验任务4

源代码

点击查看代码
#include <stdio.h>
#include <windows.h>

int main(){
    system("chcp 65001");

    printf("data4.txt统计结果:\n");
    read();

    return 0;
}

void read(){
    FILE *fp;
    int ch;
    int lines = 1;
    int chars = 0;
    
    // 以读写的方式打开文本文件data1.txt 
	fp = fopen("data4.txt", "r+");
	
	// 如果打开文件失败,输出提示信息并返回 
	if(fp == NULL) {
		printf("fail to open file to write\n");
		return;
    }

    while ((ch = fgetc(fp)) !=EOF){
        if (ch == '\n'){
            lines++;
        }

        else if (ch != ' ' && ch != '\n' && ch != '\t'){
            chars++;
        }
    }

    fclose(fp);
    printf("行数:  %d\n", lines);
    printf("字符数(不记空白符):  %d\n", chars);

    return 0;
}

实验结果

image

实验结论

我发现这个代码不能把task4.c和data4.txt放在同一个目录下面
然后我把data4.txt放在了系统自己生成的output文件夹里就成功了

实验任务5

源代码

点击查看代码
#include <stdio.h>
#include <string.h>
#include <windows.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() {
    system("chcp 65001");
    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);   

    printf("\n通过考试的名单写入文件: 已完成!\n");
    write(stu_pass, cnt);

    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;
    FILE *fin;

    fin = fopen("examinee.txt", "r");
    if (!fin) {
        printf("fail to open file\n");
        return;
    }

    for (i = 0; i < n; i++)
        fscanf(fin, "%ld %s %f %f", &st[i].id, st[i].name, &st[i].objective, &st[i].subjective);

    fclose(fin);
}

// 对考生信息进行处理:计算每位考生考试总分、结果;统计并返回通过考试的人数
int process(STU st[], int n, STU st_pass[]) {
    int i, count = 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[count] = st[i];
            count++;
        }
        else{
            strcpy(st[i].result, "未通过");
        }
    }
    return count;
}

// 把通过考试的考生完整信息写入文件list_pass.txt
// 准考证号,姓名,客观题得分,操作题得分,总分,结果
void write(STU st[], int n) {
    int i;
    FILE *fout;

    fout = fopen("list_pass.txt", "w");

    if(fout == NULL) {
		printf("fail to open file to write\n");
		return;
    }

    fprintf(fout, "准考证号\t姓名\t客观题得分\t操作题得分\t总分\t\t结果\n");
    for (i = 0; i < n; i++){
        fprintf(fout, "%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);

    }

    fclose(fout);
}

实验结果

image

实验任务6

源代码

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>

#define N 80
#define WINNERS 5

typedef struct {
    char id[20];
    char name[20];
    char class_name[50];
} Student;

// 读取学生信息
int read_students(Student students[], const char* filename) {
    FILE* fp = fopen(filename, "r");
    if (!fp) {
        printf("无法打开文件 %s\n", filename);
        return 0;
    }
    
    int count = 0;
    while (fscanf(fp, "%s %s %[^\n]", students[count].id, students[count].name, students[count].class_name) == 3) {
        count++;
        if (count >= N) break;
    }
    
    fclose(fp);
    return count;
}

// 随机抽取5位中奖者
void draw_winners(Student students[], int total, Student winners[], int winner_count) {
    int flag[N] = {0};  // 标记数组,记录学生是否已被抽取
    int selected = 0;
    
    srand((unsigned int)time(NULL));  // 用当前时间初始化随机数种子
    
    while (selected < winner_count) {
        int index = rand() % total;  // 生成0到total-1的随机数
        
        if (flag[index] == 0) {  // 如果该学生未被抽取
            winners[selected] = students[index];
            flag[index] = 1;  // 标记为已抽取
            selected++;
        }
    }
}

// 获取当前日期作为文件名
void get_current_date_filename(char* filename, int size) {
    time_t now;
    struct tm* local;
    
    time(&now);
    local = localtime(&now);
    
    strftime(filename, size, "%Y%m%d.txt", local);
}

// 保存中奖名单到文件
void save_winners_to_file(Student winners[], int count, const char* filename) {
    FILE* fp = fopen(filename, "w");
    if (!fp) {
        printf("无法创建文件 %s\n", filename);
        return;
    }
    
    for (int i = 0; i < count; i++) {
        fprintf(fp, "%s %s %s\n", winners[i].id, winners[i].name, winners[i].class_name);
    }
    
    fclose(fp);
    printf("保存成功!\n");
}

// 显示中奖名单
void display_winners(Student winners[], int count) {
    printf("\n中奖名单:\n");
    printf("学号\t\t姓名\t班级\n");
    printf("----------------------------------------\n");
    for (int i = 0; i < count; i++) {
        printf("%s\t%s\t%s\n", winners[i].id, winners[i].name, winners[i].class_name);
    }
    printf("\n");
}

int main() {
    system("chcp 65001");
    Student students[N];
    Student winners[WINNERS];
    int total_students;
    char filename[50];
    
    // 1. 读取学生信息
    total_students = read_students(students, "list.txt");
    if (total_students == 0) {
        printf("读取学生信息失败!\n");
        return 1;
    }
    printf("成功读取 %d 位学生信息\n", total_students);
    
    // 2. 随机抽取中奖者
    draw_winners(students, total_students, winners, WINNERS);
    
    // 3. 显示中奖名单
    display_winners(winners, WINNERS);
    
    // 4. 获取当前日期作为文件名
    get_current_date_filename(filename, sizeof(filename));
    printf("输入文件名:%s\n", filename);
    
    // 5. 保存到文件
    save_winners_to_file(winners, WINNERS, filename);
    
    return 0;
}

实验结果

image

posted @ 2026-06-23 20:59  hanxiuying  阅读(2)  评论(0)    收藏  举报