实验七 文件应用编程

实验七 文件应用编程

实验任务1——文本文件读写

// 文件读写操作:格式化读、写文本文件
#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, 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;
	int number;

	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 (!feof(fp)) {
		number = fscanf(fp, "%s%s", x[i].name, x[i].author);
		if (number != 2)
			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);
}
《雕塑家》                               斯科特.麦克劳德     
《灯塔》                                 克里斯多夫.夏布特   
《人的局限性》                           塞缪尔.约翰生       
《永不停步:玛格丽特.阿特伍德传》        罗斯玛丽.沙利文     
《大地之上》                             罗欣顿·米斯特里    
《上学记》                               何兆武              
《命运》                                 蔡崇达              

1-1 1-2


问题1 去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资料,分析这两行代码放在这里起到什么作用?

去掉会很烫 因为文件最后存在一个换行符,所以会多读取一次。因此要判断是否成功读取。

实验任务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;

    // 计算数组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;
    int number;

    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 (!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);
}
2-1 2-2


问题1 去掉line75-76,重新编译,再次运行程序,观察结果,对比运行结果是否有不同。结合结果,查阅资料,分析这两行代码放在这里起到什么作用?

同实验任务1

实验任务3——以字符、字符串形式读写文本文件

// 文件读写操作:以字符、字符串形式读、写

#include <stdio.h>
#define N 5
#define M 80

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

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

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

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

    return 0;
}

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

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

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

    fclose(fp);
}

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

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

    for (i = 0; i < N; ++i)
        fgets(songs[i], 80, fp);

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

    fclose(fp);
}

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

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

    while (!feof(fp)) {
        ch = fgetc(fp);
        if (ch == EOF)
            break;

        putchar(ch);
    }

    fclose(fp);
}
3-1 3-2


问题1 代码line25字符串 "Working's Blues"输出时为什么没有显示反斜杠?

\是转义字符

实验任务4——统计行数字数

#include <stdio.h>

int main() {
	FILE* fp;
	fp = fopen("data4.txt", "r");
	if (fp == NULL) {
		return -1;
	}
	char t;
	int line_count = 0, char_count = 0;
	while (feof(fp) == 0) {
		t = fgetc(fp);
		if (t == EOF) {
			line_count++;
			break;
		}
		else if (t!=' '&&t!='\n'&&t!='\t') {
			char_count++;
		}
		else if (t == '\n') {
			line_count++;
		}

	}
	printf("data4.txt统计结果\n行数:%d\n字数:%d", line_count, char_count);
}
0123456789-0123456789
nuist2025
cosmos  galaxy
4-1


实验任务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, 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;
    FILE* fin;

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

    while (!feof(fin)) {
        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);
}

// 把通过考试的考生完整信息写入文件list_pass.txt
// 准考证号,姓名,客观题得分,操作题得分,总分,结果
void write(STU s[], int n) {
    // 待补足
    // xxx
    FILE* fp;
    fp = fopen("list_pass.txt", "w");
    if (!fp) {
        printf("fail to open file\n");
        return;
    }
    for (int i = 0; i < n; i++) {
        if (s[i].sum >= 60) {
            fprintf(fp, "%ld %s %f %f %f %s\n", s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].result);
        }
    }
}

// 对考生信息进行处理:计算每位考生考试总分、结果;统计考试通过的人数
    int process(STU st[], int n, STU st_pass[]) {
        // 待补足
        // xxx
        int count = 0;
        for (int 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;
    }
1001	桃乐丝	36	55
1002	稻草人	28	40
1003	千寻	39	55
1004	白龙	35	60
1005	汤婆婆	20	35
1006	无脸男	33	50
1007	希达	40	32
1008	巴鲁	28	30
1009	苏菲	37	60
1010	哈尔	35	57
5-1 5-2


实验任务6——随机抽人

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct stu
{
	long long id;
	char name[20];
	char class[20];
};


int main() {
	FILE* fp;
	struct stu students[80];

	fp = fopen("list.txt", "r");
	if (!fp) {
		printf("fail to open file\n");
		return -1;
	}
	for (int i = 0; i < 80; i++) {
		fscanf(fp, "%lld%s%s", &students[i].id, students[i].name, students[i].class);
	}
	fclose(fp);
	srand((unsigned)time(NULL));

	int count = 0;
	int temp[5] = { 81,81,81,81,81 };
	struct stu p[5];

	while (count<5) {
		int a;
		a = rand() % 80;
		int flag = 0;
		for (int i = 0; i < 5; i++) {
			if (temp[i] == a) {
				flag = 1;
				break;
			}
		}
		if (flag) {
			continue;
		}
		temp[count] = a;
		p[count++] = students[a];
	}

	struct stu t;
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 4 - i; j++) {
			if (p[j].id > p[j + 1].id) {
				t = p[j];
				p[j] = p[j + 1];
				p[j + 1] = t;
			}
		}
	}

	printf("----------------随机抽人名单-----------------\n");
	for (int i = 0; i < 5; i++) {
		fprintf(stdout, "%lld\t%s\t%s\n", p[i].id, p[i].name, p[i].class);
	}
	printf("------------------保存文件-------------------\n");
	time_t timep;
	struct tm* pt;
	time(&timep);
	pt = gmtime(&timep);
	char path[100];
	char name[100];
	printf("输入文件名:");
	scanf("%s", name);
	sprintf(path, "%s_%d%d%d.txt",name,1990+ pt->tm_year,1+ pt->tm_mon, pt->tm_mday);

	FILE* fp2;
	fp2 = fopen(path, "w");
	for (int i = 0; i < 5; i++) {
		fprintf(fp2, "%lld\t%s\t%s\n", p[i].id, p[i].name, p[i].class);
	}
	printf("保存成功!");
	fclose(fp2);
}
204942001	抖森	星际联盟2049(1)班	
204942002	卷福	星际联盟2049(1)班	
204942003	毛怪	星际联盟2049(1)班	
204942004	大眼仔	星际联盟2049(1)班	
204942005	辛巴	星际联盟2049(1)班	
204942006	裘花	星际联盟2049(1)班	
204942007	小李子	星际联盟2049(1)班	
204942008	甜茶	星际联盟2049(1)班	
204942009	囧瑟夫	星际联盟2049(1)班	
204942010	霉霉	星际联盟2049(1)班	
204942011	大表姐	星际联盟2049(1)班	
204942012	大白	星际联盟2049(1)班	
204942013	灭霸	星际联盟2049(1)班	
204942014	桃乐丝	星际联盟2049(1)班	
204942015	稻草人	星际联盟2049(1)班	
204942016	Max	星际联盟2049(1)班	
204942017	chappie	星际联盟2049(1)班	
204942018	千寻	星际联盟2049(1)班	
204942019	Sean	星际联盟2049(1)班	
204942020	白龙	星际联盟2049(1)班	
204942021	汤婆婆	星际联盟2049(1)班	
204942022	无脸男	星际联盟2049(1)班	
204942023	希达	星际联盟2049(1)班	
204942024	巴鲁	星际联盟2049(1)班	
204942025	朵拉	星际联盟2049(1)班	
204942026	普麻	星际联盟2049(1)班	
204942027	苏菲	星际联盟2049(1)班	
204942028	哈尔	星际联盟2049(1)班	
204942029	小海	星际联盟2049(1)班	
204942030	风间俊	星际联盟2049(1)班	
204942031	麦康纳	星际联盟2049(1)班	
204942032	德尼罗	星际联盟2049(1)班	
204942033	安德鲁	星际联盟2049(1)班	
204942034	西蒙斯	星际联盟2049(1)班	
204942035	伍德	星际联盟2049(1)班	
204942036	朱诺	星际联盟2049(1)班	
204942037	海蒂	星际联盟2049(1)班	
204942038	凯奇	星际联盟2049(1)班	
204942039	阿桑奇	星际联盟2049(1)班	
204942040	斯诺登	星际联盟2049(1)班	
204942041	斯沃茨	星际联盟2049(1)班	
204942042	小丑男	星际联盟2049(1)班	
204942043	维文	星际联盟2049(1)班	
204942044	瓦力	星际联盟2049(1)班	
204942045	伊娃	星际联盟2049(1)班	
204942046	七角怪	星际联盟2049(1)班	
204942047	废柴	星际联盟2049(1)班	
204942048	哆啦A梦	星际联盟2049(1)班	
204942049	Sam	星际联盟2049(1)班	
204942050	Frank	星际联盟2049(1)班	
204942051	帕西诺	星际联盟2049(1)班	
204942052	罗宾森	星际联盟2049(1)班	
204942053	卡罗尔	星际联盟2049(1)班	
204942054	达西	星际联盟2049(1)班	
204942055	列维	星际联盟2049(1)班	
204942056	瑞秋	星际联盟2049(1)班	
204942057	吉尔	星际联盟2049(1)班	
204942058	伊内兹	星际联盟2049(1)班	
204942059	卡拉	星际联盟2049(1)班	
204942060	凯西	星际联盟2049(1)班	
204942061	德里安	星际联盟2049(1)班	
204942062	玛丽昂	星际联盟2049(1)班	
204942063	本杰明	星际联盟2049(1)班	
204942064	多姆	星际联盟2049(1)班	
204942065	比尔	星际联盟2049(1)班	
204942066	丽丝	星际联盟2049(1)班	
204942067	蒂安娜	星际联盟2049(1)班	
204942068	阿卢	星际联盟2049(1)班	
204942069	雷婆	星际联盟2049(1)班	
204942070	沙维	星际联盟2049(1)班	
204942071	艾佛特	星际联盟2049(1)班	
204942072	马特	星际联盟2049(1)班	
204942073	达克斯	星际联盟2049(1)班	
204942074	基廷	星际联盟2049(1)班	
204942075	Shaw	星际联盟2049(1)班	
204942076	Thomas	星际联盟2049(1)班	
204942077	维特	星际联盟2049(1)班	
204942078	Jennie	星际联盟2049(1)班	
204942079	Tibby	星际联盟2049(1)班	
204942080	Vermont	星际联盟2049(1)班

6-1 6-2


posted @ 2024-12-25 00:00  氧化铜の人  阅读(50)  评论(0)    收藏  举报