第47练 单元10 随机读写与二进制读写《C语言程序设计》(高教版第2版)一课一练
|
2份
|
8页
|
49人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元10的第47练,内容涵盖单元10“学生信息管理系统”的数据保存10.2.3 随机读写(fseek/rewind/ftell)与二进制读写(fread/fwrite)。
《C语言程序设计》(高教版第2版)一课一练 第47练
单元10 “学生信息管理系统”的数据保存
10.2.3 随机读写(fseek/rewind/ftell)与二进制读写(fread/fwrite)
1、 单项选择题(本题共5小题)
1、下列关于 fseek 函数起始点宏定义的描述,正确的是( )
A. SEEK_SET 代表文件当前位置,对应数字 1
B. SEEK_CUR 代表文件开始位置,对应数字 0
C. SEEK_END 代表文件末尾位置,对应数字 2
D. SEEK_SET 代表文件末尾位置,对应数字 2
【答案】C
【解析】C 语言预定义了三个文件起始点宏:SEEK_SET 对应数字 0(文件开始)、SEEK_CUR 对应数字 1(当前位置)、SEEK_END 对应数字 2(文件末尾),只有 C 选项描述正确。
2、调用 ftell (fp) 函数成功执行后,返回值的含义是( )
A. 当前位置相对于文件末尾的字节偏移量
B. 当前位置相对于文件开头的字节偏移量
C. 文件的总字节数
D. 0 表示成功,-1 表示失败
【答案】B
【解析】ftell 函数的功能是获取文件指针当前位置,返回值为相对于文件开头的字节偏移量;文件总字节数可通过定位到末尾后调用 ftell 获取,但不是 ftell 的直接返回含义;D 选项是 fclose 等函数的返回规则。
3、下列函数中,能无条件将文件指针移到文件开头位置的是( )
A. fseek
B. ftell
C. rewind
D. fread
【答案】C
【解析】rewind 函数的核心功能是将文件指针重置到文件开头,无需额外参数;fseek 需要指定起始点和偏移量才能定位到开头,ftell 用于获取位置,fread 用于读取数据。
4、使用 fseek 函数时,偏移量的类型必须是( )
A. int
B. long
C. float
D. char
【答案】B
【解析】fseek 的偏移量要求为长整型(long),避免因文件过大导致偏移量溢出,通常在数字末尾加 “L” 表示长整型,如 20L。
5、已知二进制文件中存储了多个 struct Student 类型的数据,要读取第 5 个学生的信息,正确的 fseek 定位语句是( )
A. fseek (fp, 4sizeof(struct Student), SEEK_SET);
B. fseek(fp, 5sizeof (struct Student), SEEK_SET);
C. fseek (fp, sizeof (struct Student), SEEK_CUR);
D. fseek (fp, -5*sizeof (struct Student), SEEK_END);
【答案】A
【解析】第 5 个学生前面有 4 个学生,每个学生占 sizeof (struct Student) 字节,因此从文件开头(SEEK_SET)偏移 4 倍结构体大小即可定位到第 5 个学生的起始位置;B 选项偏移量错误,会定位到第 6 个学生;C、D 选项的起始点和偏移量不符合需求。
2、 判断题(本题共4题)
1、fseek 函数的偏移量可以使用 int 类型,无需强制转换为 long 类型。( )
【答案】×
【解析】fseek 的偏移量必须是长整型(long),若使用 int 类型,当文件过大时会出现偏移量溢出,导致定位错误,通常需要在数字末尾加 “L” 表示长整型。
2、ftell 函数执行失败时,返回值为 EOF(即 - 1)。( )
【答案】√
【解析】ftell 函数成功返回当前位置的偏移量,失败时返回 EOF(值为 - 1),可通过该返回值判断是否获取位置成功。
3、rewind 函数的功能是将文件指针移动到文件末尾位置。( )
【答案】×
【解析】rewind 函数的功能是无条件将文件指针重置到文件开头位置,而非文件末尾;定位到末尾需使用 fseek (fp, 0L, SEEK_END)。
4、随机读写文件的核心是通过 fseek 函数定位文件指针,再进行读写操作。( )
【答案】√
【解析】随机读写打破了顺序读写的限制,必须先通过 fseek 定位到指定位置,再调用 fread 或 fwrite 完成数据读写,这是随机读写的基本流程。
3、 程序填空题(本题共1题)
1、题目描述:以下程序用于修改二进制文件file1.dat中第 3 个学生的年龄信息,需补充缺失代码实现完整功能;
#include <stdio.h>
#include <stdlib.h>
struct Student {
int num;
char name[20];
int age;
};
int main() {
FILE *fp;
struct Student stu;
// (1) 以二进制读写方式打开文件file1.dat
fp = fopen("file1.dat", ____);
if (fp == NULL) {
printf("文件打开失败!
");
exit(0);
}
// (2) 定位到第3个学生的起始位置(前面有2个学生)
fseek(fp, ____, SEEK_SET);
// (3) 读取该学生的信息到stu变量中
fread(&stu, ____, 1, fp);
// 修改学生年龄为18岁
stu.age = 18;
// (4) 将文件指针重新定位到第3个学生的起始位置(因fread后指针已移动)
____;
// 将修改后的信息写回文件
fwrite(&stu, sizeof(struct Student), 1, fp);
// (5) 关闭文件
fclose(fp);
printf("学生年龄修改成功!
");
return 0;
}
【答案】
(1)"rb+"
(2)2*sizeof(struct Student)
(3)sizeof(struct Student)
(4)fseek(fp, 2*sizeof (struct Student), SEEK_SET)
【解析】
(1)"rb+" 是二进制读写方式,既支持读取文件内容,也支持写入修改,且文件不存在时打开失败,符合修改已有文件的需求。
(2)第 3 个学生前面有 2 个学生,每个学生占 sizeof (struct Student) 字节,因此偏移量为 2 倍结构体大小,从文件开头定位到目标位置。
(3)fread 的第二个参数是单个数据项的大小,这里传入结构体大小,确保读取完整的学生信息到 stu 变量中。
(4)执行 fread 后,文件指针会自动移动到下一个数据位置,因此需要重新调用 fseek 定位到原位置,才能将修改后的信息覆盖写入原位置。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元10的第47练,内容涵盖单元10“学生信息管理系统”的数据保存10.2.3 随机读写(fseek/rewind/ftell)与二进制读写(fread/fwrite)。
《C语言程序设计》(高教版第2版)一课一练 第47练
单元10 “学生信息管理系统”的数据保存
10.2.3 随机读写(fseek/rewind/ftell)与二进制读写(fread/fwrite)
1、 单项选择题(本题共5小题)
1、下列关于 fseek 函数起始点宏定义的描述,正确的是( )
A. SEEK_SET 代表文件当前位置,对应数字 1
B. SEEK_CUR 代表文件开始位置,对应数字 0
C. SEEK_END 代表文件末尾位置,对应数字 2
D. SEEK_SET 代表文件末尾位置,对应数字 2
2、调用 ftell (fp) 函数成功执行后,返回值的含义是( )
A. 当前位置相对于文件末尾的字节偏移量
B. 当前位置相对于文件开头的字节偏移量
C. 文件的总字节数
D. 0 表示成功,-1 表示失败
3、下列函数中,能无条件将文件指针移到文件开头位置的是( )
A. fseek
B. ftell
C. rewind
D. fread
4、使用 fseek 函数时,偏移量的类型必须是( )
A. int
B. long
C. float
D. char
5、已知二进制文件中存储了多个 struct Student 类型的数据,要读取第 5 个学生的信息,正确的 fseek 定位语句是( )
A. fseek (fp, 4sizeof(struct Student), SEEK_SET);
B. fseek(fp, 5sizeof (struct Student), SEEK_SET);
C. fseek (fp, sizeof (struct Student), SEEK_CUR);
D. fseek (fp, -5*sizeof (struct Student), SEEK_END);
2、 判断题(本题共4题)
1、fseek 函数的偏移量可以使用 int 类型,无需强制转换为 long 类型。( )
2、ftell 函数执行失败时,返回值为 EOF(即 - 1)。( )
3、rewind 函数的功能是将文件指针移动到文件末尾位置。( )
4、随机读写文件的核心是通过 fseek 函数定位文件指针,再进行读写操作。( )
3、 程序填空题(本题共1题)
1、题目描述:以下程序用于修改二进制文件file1.dat中第 3 个学生的年龄信息,需补充缺失代码实现完整功能;
#include <stdio.h>
#include <stdlib.h>
struct Student {
int num;
char name[20];
int age;
};
int main() {
FILE *fp;
struct Student stu;
// (1) 以二进制读写方式打开文件file1.dat
fp = fopen("file1.dat", ____);
if (fp == NULL) {
printf("文件打开失败!
");
exit(0);
}
// (2) 定位到第3个学生的起始位置(前面有2个学生)
fseek(fp, ____, SEEK_SET);
// (3) 读取该学生的信息到stu变量中
fread(&stu, ____, 1, fp);
// 修改学生年龄为18岁
stu.age = 18;
// (4) 将文件指针重新定位到第3个学生的起始位置(因fread后指针已移动)
____;
// 将修改后的信息写回文件
fwrite(&stu, sizeof(struct Student), 1, fp);
// (5) 关闭文件
fclose(fp);
printf("学生年龄修改成功!
");
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$