内容正文:
9.5节:文件应用实例
一、单项选择题
1.以下关于feof函数的描述,正确的是( )
A. 在读取到EOF时立即返回真
B. 在文件位置标记到达末尾时返回真
C. 需要先尝试读取才能正确判断
D. 只能用于文本文件
2.使用fgets函数读取一行文本时,以下说法错误的是()
A. 读取的字符串包含换行符
B. 可以指定最大读取字符数
C. 遇到文件结束返回NULL
D. 不能读取二进制文件
3.以下代码片段的功能是()
FILE *fp = fopen("output.txt", "w");
fprintf(fp, "Count: %d
", 10);
A. 从文件读取数据
B. 向文件写入格式化数据
C. 修改文件权限
D. 关闭文件
4.使用fscanf函数从文件读取数据时,以下说法正确的是()
A. 只能读取文本文件
B. 可以读取二进制数据
C. 不需要指定格式字符串
D. 返回值是读取的字节数
5.以下关于rewind函数的描述,错误的是()
A. 将文件位置标记移动到开头
B. 清除文件结束标志
C. 相当于fseek(fp, 0L, SEEK_SET)
D. 可以修改文件内容
6.以下代码片段的功能是()
FILE *fp = fopen("data.bin", "rb");
int arr[10];
fread(arr, sizeof(int), 10, fp);
A. 向文件写入数组
B. 从文件读取数组
C. 修改数组内容
D. 比较数组内容
7.以下关于文件位置标记的描述,正确的是()
A. 打开文件时位置标记在文件末尾
B. 每次读写操作后位置标记自动移动
C. 位置标记可以用指针直接修改
D. 位置标记的单位是位(bit)
8.以下代码片段的功能是()
FILE *fp = fopen("log.txt", "a");
fprintf(fp, "Event: %s
", "start");
A. 读取日志文件
B. 向日志文件追加内容
C. 清空日志文件
D. 删除日志文件
9.使用fputs函数向文件写入字符串时,以下说法正确的是()
A. 会自动添加换行符
B. 可以写入二进制数据
C. 不能写入空字符串
D. 必须指定字符串长度
10.以下代码片段的功能是()
FILE *fp = fopen("data.txt", "r+");
fseek(fp, 10L, SEEK_SET);
fputc('X', fp);
A. 在第10个字符位置写入'X'
B. 在第11个字符位置写入'X'
C. 在文件末尾写入'X'
D. 读取第10个字符
二、程序运行结果题
11.以下程序执行后,文件"output.txt"的内容是()
#include <stdio.h>
main() {
FILE *fp = fopen("output.txt", "w");
fprintf(fp, "%d %c %.1f", 10, 'A', 3.5);
fclose(fp);
}
12.以下程序执行后,屏幕输出结果是(假设文件"data.txt"内容为"123 45.6")()
#include <stdio.h>
main() {
FILE *fp = fopen("data.txt", "r");
int a;
float b;
fscanf(fp, "%d%f", &a, &b);
printf("%d %.1f", a, b);
fclose(fp);
}
13.以下程序执行后,文件"test.txt"的内容是()
#include <stdio.h>
main() {
FILE *fp = fopen("test.txt", "w");
fputs("Hello", fp);
fputc('
', fp);
fputs("World", fp);
fclose(fp);
}
14.以下程序执行后,屏幕输出结果是(假设文件"nums.txt"内容为"1 2 3 4 5")()
#include <stdio.h>
main() {
FILE *fp = fopen("nums.txt", "r");
int num, sum = 0;
while(fscanf(fp, "%d", &num) == 1) {
sum += num;
}
printf("%d", sum);
fclose(fp);
}
15.以下程序执行后,屏幕输出结果是(假设文件"text.txt"内容为"ABC
DEF
")()
#include <stdio.h>
main() {
FILE *fp = fopen("text.txt", "r");
char line[100];
fgets(line, 100, fp);
printf("%s", line);
fgets(line, 100, fp);
printf("%s", line);
fclose(fp);
}
16.以下程序执行后,文件"log.txt"的内容是()
#include <stdio.h>
main() {
FILE *fp = fopen("log.txt", "a");
fprintf(fp, "Start
");
fclose(fp);
fp = fopen("log.txt", "a");
fprintf(fp, "End
");
fclose(fp);
}
17.以下程序执行后,屏幕输出结果是(假设文件"binary.dat"内容为10个整数:1-10)()
#include <stdio.h>
main() {
FILE *fp = fopen("binary.dat", "rb+");
int num;
long pos;
fseek(fp, 4 * sizeof(int), SEEK_SET);
fread(&num, sizeof(int), 1, fp);
printf("第5个: %d
", num);
pos = ftell(fp);
fwrite(&num, sizeof(int), 1, fp);
num = 99;
fseek(fp, -sizeof(int), SEEK_CUR);
fwrite(&num, sizeof(int), 1, fp);
fseek(fp, pos, SEEK_SET);
fread(&num, sizeof(int), 1, fp);
printf("修改后: %d
", num);
fclose(fp);
}
18.以下程序执行后,屏幕输出结果是(假设文件"students.dat"有5个学生:{1,70},{2,85},{3,90},{4,65},{5,80})()
#include <stdio.h>
struct Student {
int id;
int score;
};
main() {
FILE *fp = fopen("students.dat", "rb");
struct Student stu;
int passed = 0, failed = 0,i;
rewind(fp);
while(!feof(fp)) {
fread(&stu, sizeof(struct Student), 1, fp);
if(!feof(fp)) {
if(stu.score >= 60) passed++;
else failed++;
}
}
printf("及格学生(%d人):
", passed);
rewind(fp);
for(i = 0; i < 5; i++) {
fseek(fp, i * sizeof(struct Student), SEEK_SET);
fread(&stu, sizeof(struct Student), 1, fp);
if(stu.score >= 60) {
printf("ID: %d, Score: %d
", stu.id, stu.score);
}
}
fclose(fp);
}
19.以下程序执行后,屏幕输出结果是(假设文件"data.txt"内容为"100 200 300")()
#include <stdio.h>
main() {
FILE *fp = fopen("data.txt", "r");
int a, b, c;
fscanf(fp, "%d%d%d", &a, &b, &c);
printf("%d", a + b + c);
fclose(fp);
}
20.以下程序执行后,屏幕输出结果是(假设文件"text.txt"内容为"ABC")()
#include <stdio.h>
main() {
FILE *fp = fopen("text.txt", "r");
char ch;
ch = fgetc(fp);
printf("%c", ch);
ch = fgetc(fp);
printf("%c", ch);
fclose(fp);
}
三、编程题
1. 编写一个程序,读取文本文件"article.txt"中的内容,统计并输出文件中字母、数字、空格和其他字符的数量。假设文件内容为"C Programming 101",程序运行后输出结果。
2.编写程序从文件"data.txt"中读取整数,将偶数写入"even.txt",奇数写入"odd.txt"。
3.编写程序将两个文件"part1.txt"和"part2.txt"的内容合并到"merged.txt"中。
4.编写程序读取文件"students.txt"中的学生信息(每行格式:姓名 年龄 成绩),计算并输出每个学生的平均分和总分。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
9.5节:文件应用实例
一、单项选择题
1.以下关于feof函数的描述,正确的是( )
A. 在读取到EOF时立即返回真
B. 在文件位置标记到达末尾时返回真
C. 需要先尝试读取才能正确判断
D. 只能用于文本文件
【答案】C
2.使用fgets函数读取一行文本时,以下说法错误的是( )
A. 读取的字符串包含换行符
B. 可以指定最大读取字符数
C. 遇到文件结束返回NULL
D. 不能读取二进制文件
【答案】D
3.以下代码片段的功能是( )
FILE *fp = fopen("output.txt", "w");
fprintf(fp, "Count: %d
", 10);
A. 从文件读取数据
B. 向文件写入格式化数据
C. 修改文件权限
D. 关闭文件
【答案】B
4.使用fscanf函数从文件读取数据时,以下说法正确的是( )
A. 只能读取文本文件
B. 可以读取二进制数据
C. 不需要指定格式字符串
D. 返回值是读取的字节数
【答案】A
5.以下关于rewind函数的描述,错误的是( )
A. 将文件位置标记移动到开头
B. 清除文件结束标志
C. 相当于fseek(fp, 0L, SEEK_SET)
D. 可以修改文件内容
【答案】D
6.以下代码片段的功能是( )
FILE *fp = fopen("data.bin", "rb");
int arr[10];
fread(arr, sizeof(int), 10, fp);
A. 向文件写入数组
B. 从文件读取数组
C. 修改数组内容
D. 比较数组内容
【答案】B
7.以下关于文件位置标记的描述,正确的是( )
A. 打开文件时位置标记在文件末尾
B. 每次读写操作后位置标记自动移动
C. 位置标记可以用指针直接修改
D. 位置标记的单位是位(bit)
【答案】B
8.以下代码片段的功能是( )
FILE *fp = fopen("log.txt", "a");
fprintf(fp, "Event: %s
", "start");
A. 读取日志文件
B. 向日志文件追加内容
C. 清空日志文件
D. 删除日志文件
【答案】B
9.使用fputs函数向文件写入字符串时,以下说法正确的是( )
A. 会自动添加换行符
B. 可以写入二进制数据
C. 不能写入空字符串
D. 必须指定字符串长度
【答案】B
10.以下代码片段的功能是( )
FILE *fp = fopen("data.txt", "r+");
fseek(fp, 10L, SEEK_SET);
fputc('X', fp);
A. 在第10个字符位置写入'X'
B. 在第11个字符位置写入'X'
C. 在文件末尾写入'X'
D. 读取第10个字符
【答案】A
二、程序运行结果题
11.以下程序执行后,文件"output.txt"的内容是( )
#include <stdio.h>
main() {
FILE *fp = fopen("output.txt", "w");
fprintf(fp, "%d %c %.1f", 10, 'A', 3.5);
fclose(fp);
}
【答案】10 A 3.5
12.以下程序执行后,屏幕输出结果是(假设文件"data.txt"内容为"123 45.6")( )
#include <stdio.h>
main() {
FILE *fp = fopen("data.txt", "r");
int a;
float b;
fscanf(fp, "%d%f", &a, &b);
printf("%d %.1f", a, b);
fclose(fp);
}
【答案】123 45.6
13.以下程序执行后,文件"test.txt"的内容是( )
#include <stdio.h>
main() {
FILE *fp = fopen("test.txt", "w");
fputs("Hello", fp);
fputc('
', fp);
fputs("World", fp);
fclose(fp);
}
【答案】
Hello
World
14.以下程序执行后,屏幕输出结果是(假设文件"nums.txt"内容为"1 2 3 4 5")( )
#include <stdio.h>
main() {
FILE *fp = fopen("nums.txt", "r");
int num, sum = 0;
while(fscanf(fp, "%d", &num) == 1) {
sum += num;
}
printf("%d", sum);
fclose(fp);
}
【答案】15
15.以下程序执行后,屏幕输出结果是(假设文件"text.txt"内容为"ABC
DEF
")( )
#include <stdio.h>
main() {
FILE *fp = fopen("text.txt", "r");
char line[100];
fgets(line, 100, fp);
printf("%s", line);
fgets(line, 100, fp);
printf("%s", line);
fclose(fp);
}
【答案】
ABC
DEF
16.以下程序执行后,文件"log.txt"的内容是( )
#include <stdio.h>
main() {
FILE *fp = fopen("log.txt", "a");
fprintf(fp, "Start
");
fclose(fp);
fp = fopen("log.txt", "a");
fprintf(fp, "End
");
fclose(fp);
}
【答案】
Start
End
17.以下程序执行后,屏幕输出结果是(假设文件"binary.dat"内容为10个整数:1-10)( )
#include <stdio.h>
main() {
FILE *fp = fopen("binary.dat", "rb+");
int num;
long pos;
fseek(fp, 4 * sizeof(int), SEEK_SET);
fread(&num, sizeof(int), 1, fp);
printf("第5个: %d
", num);
pos = ftell(fp);
fwrite(&num, sizeof(int), 1, fp);
num = 99;
fseek(fp, -sizeof(int), SEEK_CUR);
fwrite(&num, sizeof(int), 1, fp);
fseek(fp, pos, SEEK_SET);
fread(&num, sizeof(int), 1, fp);
printf("修改后: %d
", num);
fclose(fp);
}
【答案】
第5个: 5
修改后: 99
18.以下程序执行后,屏幕输出结果是(假设文件"students.dat"有5个学生:{1,70},{2,85},{3,90},{4,65},{5,80})( )
#include <stdio.h>
struct Student {
int id;
int score;
};
main() {
FILE *fp = fopen("students.dat", "rb");
struct Student stu;
int passed = 0, failed = 0,i;
rewind(fp);
while(!feof(fp)) {
fread(&stu, sizeof(struct Student), 1, fp);
if(!feof(fp)) {
if(stu.score >= 60) passed++;
else failed++;
}
}
printf("及格学生(%d人):
", passed);
rewind(fp);
for(i = 0; i < 5; i++) {
fseek(fp, i * sizeof(struct Student), SEEK_SET);
fread(&stu, sizeof(struct Student), 1, fp);
if(stu.score >= 60) {
printf("ID: %d, Score: %d
", stu.id, stu.score);
}
}
fclose(fp);
}
【答案】
及格学生(4人):
ID: 1, Score: 70
ID: 2, Score: 85
ID: 3, Score: 90
ID: 5, Score: 80
19.以下程序执行后,屏幕输出结果是(假设文件"data.txt"内容为"100 200 300")( )
#include <stdio.h>
main() {
FILE *fp = fopen("data.txt", "r");
int a, b, c;
fscanf(fp, "%d%d%d", &a, &b, &c);
printf("%d", a + b + c);
fclose(fp);
}
【答案】600
20.以下程序执行后,屏幕输出结果是(假设文件"text.txt"内容为"ABC")( )
#include <stdio.h>
main() {
FILE *fp = fopen("text.txt", "r");
char ch;
ch = fgetc(fp);
printf("%c", ch);
ch = fgetc(fp);
printf("%c", ch);
fclose(fp);
}
【答案】AB
三、编程题
1. 编写一个程序,读取文本文件"article.txt"中的内容,统计并输出文件中字母、数字、空格和其他字符的数量。假设文件内容为"C Programming 101",程序运行后输出结果。
【答案】
#include <stdio.h>
#include <ctype.h>
main() {
FILE *fp = fopen("article.txt", "r");
char ch;
int letters = 0, digits = 0, spaces = 0, others = 0;
if(fp == NULL) {
printf("文件打开失败
");
return 1;
}
while((ch = fgetc(fp)) != EOF) {
if(isalpha(ch)) {
letters++;
} else if(isdigit(ch)) {
digits++;
} else if(isspace(ch)) {
spaces++;
} else {
others++;
}
}
printf("字母: %d
", letters);
printf("数字: %d
", digits);
printf("空格: %d
", spaces);
printf("其他: %d
", others);
fclose(fp);
}
2.编写程序从文件"data.txt"中读取整数,将偶数写入"even.txt",奇数写入"odd.txt"。
【答案】
#include <stdio.h>
main() {
FILE *in = fopen("data.txt", "r");
FILE *even = fopen("even.txt", "w");
FILE *odd = fopen("odd.txt", "w");
int num;
if(in == NULL || even == NULL || odd == NULL) {
printf("文件打开失败
");
return 1;
}
while(fscanf(in, "%d", &num) == 1) {
if(num % 2 == 0) {
fprintf(even, "%d ", num);
} else {
fprintf(odd, "%d ", num);
}
}
fclose(in);
fclose(even);
fclose(odd);
}
3.编写程序将两个文件"part1.txt"和"part2.txt"的内容合并到"merged.txt"中。
【答案】
#include <stdio.h>
main() {
FILE *part1 = fopen("part1.txt", "r");
FILE *part2 = fopen("part2.txt", "r");
FILE *merged = fopen("merged.txt", "w");
char ch;
if(part1 == NULL || part2 == NULL || merged == NULL) {
printf("文件打开失败
");
return 1;
}
// 复制part1内容
while((ch = fgetc(part1)) != EOF) {
fputc(ch, merged);
}
// 复制part2内容
while((ch = fgetc(part2)) != EOF) {
fputc(ch, merged);
}
fclose(part1);
fclose(part2);
fclose(merged);
}
4.编写程序读取文件"students.txt"中的学生信息(每行格式:姓名 年龄 成绩),计算并输出每个学生的平均分和总分。
【答案】
#include <stdio.h>
main() {
FILE *fp = fopen("students.txt", "r");
char name[20];
int age, score, count = 0, sum = 0;
if(fp == NULL) {
printf("文件打开失败
");
return 1;
}
printf("学生成绩报告:
");
printf("------------
");
while(fscanf(fp, "%s%d%d", name, &age, &score) == 3) {
printf("%s: 年龄%d, 成绩%d
", name, age, score);
sum += score;
count++;
}
printf("------------
");
printf("总分: %d
", sum);
printf("平均分: %.1f
", (float)sum / count);
fclose(fp);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$