实验七 文件应用编程
实验七 文件应用编程
实验任务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 去掉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);
}
问题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);
}
问题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
实验任务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
实验任务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)班

浙公网安备 33010602011771号