内容正文:
编写说明:江苏省对口招生计算机类《考纲百套卷》,依据《江苏省计算机类专业综合理论考试大纲》编写。本专辑涵盖5门课程,第一部分是专业核心模块训练卷,第二部分为各门课程的综合训练卷。本专辑共98份试卷。
本试卷是第29卷为专业核心模块训练卷,按《C语言》中"C语言卷16——文件的读写与定位"范围和要求编写。具体内容为:理解文件的读写(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函数),文件的定位(rewind,fseek函数)。
江苏省对口招生职业技能考试
C语言 试卷
(C语言卷16——文件的读写与定位)
考试时间:90分钟 满分:100分
一、单项选择题(共20题,每题2分,共40分)
1. fputc函数用于向文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串
2. fgetc函数用于从文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串
3. fputs函数用于向文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串(不含\0)
4. fgets函数用于从文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串(含
) D.写入一行字符串
5. fprintf函数的功能类似于( )
A.printf B.scanf C.sprintf D.sscanf
6. fscanf函数的功能类似于( )
A.printf B.scanf(从键盘输入) C.sprintf D.sscanf
7. fread函数用于从文件中( )
A.读取单个数据项 B.批量读取数据块 C.读取格式化数据 D.读取一行字符串
8. fwrite函数用于向文件中( )
A.写入单个数据项 B.批量写入数据块 C.写入格式化数据 D.写入一行字符串
9. rewind函数用于将文件指针( )
A.移动到文件末尾 B.移动到文件开头 C.移动到指定位置 D.向后移动n个字节
10. fseek函数用于将文件指针( )
A.移动到文件开头 B.移动到指定位置 C.获取当前位置 D.检测是否到达文件末尾
11. fseek函数的origin参数SEEK_SET表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
12. fseek函数的origin参数SEEK_CUR表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
13. fseek函数的origin参数SEEK_END表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
14. 想要获取文件指针的当前位置,应该使用( )
A.fseek B.rewind C.ftell D.feof
15. 想要将文件指针向前移动 100 字节,正确的调用是( )
A.fseek (fp,100,SEEK_SET) B.fseek (fp,-100,SEEK_CUR)
C.fseek (fp,100,SEEK_END) D.fseek (fp,100,0)
16. 下列关于fgetc,正确的是( )
A.读取成功返回字符ASCII码值 B.读取到文件末尾返回EOF
C.可以读取任何类型文件 D.一次读取多个字符
17. 下列关于fputs和fgets的区别,正确的是( )
A.fputs写入不含\0,fgets读取含
B.两者都是单字符操作
C.fputs读取,fgets写入
D.两者都需要指定长度
18. 想要将文件指针移动到距离文件末尾10字节处,正确的调用是( )
A.fseek(fp,10,SEEK_END)
B.fseek(fp,-10,SEEK_END)
C.fseek(fp,10,SEEK_SET)
D.rewind(fp); fseek(fp,-10,SEEK_CUR)
19. 下列关于fprintf和fscanf,正确的是( )
A.fprintf向文件输出格式化数据
B.fscanf从文件读取格式化数据
C.两者用法类似printf/scanf但多了文件参数
D.以上都正确
20. 下列关于fread和fwrite,正确的是( )
A.适用于文本文件 B.适用于二进制文件
C.适用于文本和二进制文件 D.只适用于特定类型的数据
二、判断题(共10题,每题1分,共10分)
21. fputc函数用于向文件写入一个字符( )
22. fgetc函数从文件读取一个字符,读到末尾返回EOF( )
23. fputs写入的字符串包含\0( )
24. fgets读取的字符串可能包含换行符
( )
25. fprintf功能类似printf,但输出到文件而非屏幕( )
26. fseek(fp,0,SEEK_SET)等同于rewind(fp)( )
27. ftell函数返回文件指针当前位置( )
28. fread/fwrite只能用于二进制文件( )
29. SEEK_END表示从文件末尾开始偏移( )
30. fseek(fp,-10,SEEK_CUR)将文件指针从当前位置向前移动10字节( )
三、填空题(共10空,每空2分,共20分)
31. fputc函数用于向文件写入一个____。
32. fgetc函数用于从文件读取一个____。
33. fputs函数用于向文件写入一个____(不含\0)。
34. fgets函数用于从文件读取一个____(可能含
)。
35. fprintf函数的第一个参数是____指针。
36. fseek函数的三个参数分别是:文件指针、偏移量和____。
37. ____常量表示从文件开头开始偏移。
38. ____常量表示从文件末尾开始偏移。
39. ____函数用于获取文件指针的当前位置。
40. ____函数用于将文件指针重置到文件开头。
四、程序综合题(共3题,每题10分,共30分)
41. 程序填空题:阅读下列程序,请将①~④表示的内容填写完整。
(1) #include <stdio.h>
(2) int main()
(3) {
(4) FILE *fp;
(5) char s[20];
(6) fp=fopen("test.txt","w");
(7) fputs("Hello
",fp);
(8) fputs("World
",fp);
(9) fclose(fp);
(10) fp=fopen("test.txt","r");
(11) fgets(s,20,fp);
(12) printf("%s",s);
(13) fclose(fp);
(14) return 0;
(15) }
上述程序中,第7行fputs的功能是①____,第11行fgets读取最多②____个字符,
第12行输出③____,文件test.txt中共写入④____行。
42.文件social.dat存储员工号和社保缴费金额。按缴费金额降序排列后,统计并输出指定区间内所有员工的员工号。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
void sort_soc(int id[],float soc[],int n);
int main()
{
FILE *fp;
int i=0,n,cid[N];
float soc[N];
int L,R;
fp=fopen("social.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d%f",&cid[i],&soc[i]);
①;
}
n=i;
fclose(fp);
sort_soc(cid,soc,n);
scanf("%d%d",&L,&R);
int left=0,right=n-1,first=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(soc[mid]>=L)
{first=mid;right=mid-1;}
else left=mid+1;
}
left=0;right=n-1;int last=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(soc[mid]<=R)
{last=mid;left=mid+1;}
else right=mid-1;
}
if(first!=-1&&last!=-1&&first<=last)
for(i=first;i<=last;i++)
printf("%d
",cid[i]);
}
43.文件tax.dat存储纳税人ID和应纳税额。按应纳税额升序排列后,查询并输出区间[L,R]内人数及最高税额对应的纳税人ID。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 150
void bubble_sort(int id[],float tax[],int n);
int main()
{
FILE *fp;
int i=0,n,cid[N];
float tax[N];
int L,R,cnt;
fp=fopen("tax.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d%f",&cid[i],&tax[i]);
①;
}
n=i;
fclose(fp);
bubble_sort(cid,tax,n);
scanf("%d%d",&L,&R);
int left=0,right=n-1,first=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(②)
{first=mid;right=mid-1;}
else left=mid+1;
}
left=0;right=n-1;int last=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(tax[mid]<=R)
{last=mid;left=mid+1;}
else right=mid-1;
}
cnt=0;int maxid=-1;float maxt=0;
for(i=first;i<=last;i++)
{
cnt++;
if(tax[i]>maxt){maxt=tax[i];maxid=cid[i];}
}
printf("%d %d
",cnt,maxid);
}
void bubble_sort(int id[],float tax[],int n)
{
int i,j,tid;
float ttax;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(tax[j]>tax[j+1])
{
ttax=tax[j];tax[j]=tax[j+1];tax[j+1]=ttax;
tid=id[j];id[j]=id[j+1];id[j+1]=tid;
}
}
学科网(北京)股份有限公司
$
编写说明:江苏省对口招生计算机类《考纲百套卷》,依据《江苏省计算机类专业综合理论考试大纲》编写。本专辑涵盖5门课程,第一部分是专业核心模块训练卷,第二部分为各门课程的综合训练卷。本专辑共98份试卷。
本试卷是第29卷为专业核心模块训练卷,按《C语言》中"C语言卷16——文件的读写与定位"范围和要求编写。具体内容为:理解文件的读写(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函数),文件的定位(rewind,fseek函数)。
江苏省对口招生职业技能考试
C语言 试卷
(C语言卷16——文件的读写与定位)
考试时间:90分钟 满分:100分
一、单项选择题(共20题,每题2分,共40分)
1. fputc函数用于向文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串
【答案】B
【解析】fputc(ch,fp)向文件写入一个字符。
2. fgetc函数用于从文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串
【答案】A
【解析】fgetc(fp)从文件读取一个字符。
3. fputs函数用于向文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串 D.写入一行字符串(不含\0)
【答案】D
【解析】fputs(s,fp)向文件写入一个字符串(不含\0)。
4. fgets函数用于从文件中( )
A.读取一个字符 B.写入一个字符 C.读取一行字符串(含
) D.写入一行字符串
【答案】C
【解析】fgets(s,n,fp)从文件读取最多n-1个字符到s,包含换行符(如果有空间的话)。
5. fprintf函数的功能类似于( )
A.printf(输出到屏幕) B.scanf(从键盘输入)
C.sprintf(格式化到字符串) D.sscanf(从字符串解析)
【答案】A
【解析】fprintf(fp,format,...)功能类似printf,但输出到文件而非屏幕。
6. fscanf函数的功能类似于( )
A.printf B.scanf(从键盘输入) C.sprintf D.sscanf
【答案】B
【解析】fscanf(fp,format,...)功能类似scanf,但从文件读取而非键盘。
7. fread函数用于从文件中( )
A.读取单个数据项 B.批量读取数据块(字节块) C.读取格式化数据 D.读取一行字符串
【答案】B
【解析】fread(ptr,size,count,fp)批量读取数据块。
8. fwrite函数用于向文件中( )
A.写入单个数据项 B.批量写入数据块(字节块) C.写入格式化数据 D.写入一行字符串
【答案】B
【解析】fwrite(ptr,size,count,fp)批量写入数据块到文件。
9. rewind函数用于将文件指针( )
A.移动到文件末尾 B.移动到文件开头 C.移动到指定位置(需要参数) D.向后移动n个字节
【答案】B
【解析】rewind(fp)将文件指针移到开头。
10. fseek函数用于将文件指针( )
A.移动到文件开头 B.移动到指定位置 C.获取当前位置 D.检测是否到达文件末尾
【答案】B
【解析】fseek(fp,offset,origin)将文件指针移动到指定位置。
11. fseek函数的origin参数SEEK_SET表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
【答案】A
【解析】SEEK_SET=0,表示从文件开头开始偏移。
12. fseek函数的origin参数SEEK_CUR表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
【答案】B
【解析】SEEK_CUR=1,表示从当前位置开始偏移。
13. fseek函数的origin参数SEEK_END表示( )
A.文件开头 B.当前位置 C.文件末尾 D.文件中间
【答案】C
【解析】SEEK_END=2,表示从文件末尾开始偏移。
14. 想要获取文件指针的当前位置,应该使用( )
A.fseek B.rewind C.ftell D.feof
【答案】C
【解析】ftell(fp)返回文件指针当前位置(距开头的字节数)。
15. 想要将文件指针向前移动 100 字节,正确的调用是( )
A.fseek (fp,100,SEEK_SET) B.fseek (fp,-100,SEEK_CUR)
C.fseek (fp,100,SEEK_END) D.fseek (fp,100,0)
【答案】B
【解析】fseek 函数第二个参数 offset,正数代表向文件末尾移动,负数代表向文件开头(向前)移动;第三个参数:SEEK_SET(值 0)代表文件开头,SEEK_CUR 代表当前指针位置,SEEK_END 代表文件末尾。 A、D 等价,均是以文件开头为基准向后移动 100 字节;C 是以文件末尾为基准向后偏移 100 字节;B 以当前指针位置为基准,偏移 - 100,实现向前移动 100 字节,符合题意。
16. 下列关于fgetc,正确的是( )
A.读取成功返回字符ASCII码值 B.读取到文件末尾返回EOF C.可以读取任何类型文件 D.一次读取多个字符
【答案】B
【解析】fgetc读到文件末尾时返回EOF。
17. 下列关于fputs和fgets的区别,正确的是( )
A.fputs写入不含\0,fgets读取含
(如有空间)
B.两者都是单字符操作
C.fputs读取,fgets写入
D.两者都需要指定长度
【答案】A
【解析】fputs写入不含\0;fgets可包含换行符
(如果缓冲区允许)。
18. 想要将文件指针移动到距离文件末尾10字节处,正确的调用是( )
A.fseek(fp,10,SEEK_END)
B.fseek(fp,-10,SEEK_END)
C.fseek(fp,10,SEEK_SET)
D.rewind(fp); fseek(fp,-10,SEEK_CUR)
【答案】B
【解析】从文件末尾向前偏移10字节:fseek(fp,-10,SEEK_END)。
19. 下列关于fprintf和fscanf,正确的是( )
A.fprintf向文件输出格式化数据 B.fscanf从文件读取格式化数据
C.两者用法类似printf/scanf但多了文件参数 D.以上都正确
【答案】D
【解析】fprintf/fscanf与printf/scanf用法相似,第一个参数是文件指针。
20. 下列关于fread和fwrite,正确的是( )
A.适用于文本文件 B.适用于二进制文件 C.适用于文本和二进制文件 D.只适用于特定类型的数据
【答案】C
【解析】 fread/fwrite适用于二进制文件,也可用于文本文件。
二、判断题(共10题,每题1分,共10分)
21. fputc函数用于向文件写入一个字符( )
【答案】√
【解析】fputc(ch,fp)向文件写入一个字符。
22. fgetc函数从文件读取一个字符,读到末尾返回EOF( )
【答案】√
【解析】fgetc读到文件末尾时返回EOF。
23. fputs写入的字符串包含\0( )
【答案】×
【解析】fputs写入不含\0。
24. fgets读取的字符串可能包含换行符
( )
【答案】√
【解析】fgets可包含换行符(如果缓冲区允许)。
25. fprintf功能类似printf,但输出到文件而非屏幕( )
【答案】√
【解析】fprintf(fp,format,...)输出到文件。
26. fseek(fp,0,SEEK_SET)等同于rewind(fp)( )
【答案】√
【解析】两者都将文件指针移到开头。
27. ftell函数返回文件指针当前位置( )
【答案】√
【解析】ftell(fp)返回距开头的字节数。
28. fread/fwrite只能用于二进制文件( )
【答案】×
【解析】可用于二进制文件,也可用于文本文件。
29. SEEK_END表示从文件末尾开始偏移( )
【答案】√
【解析】SEEK_END=2,从文件末尾开始计算偏移量。
30. fseek(fp,-10,SEEK_CUR)将文件指针从当前位置向前移动10字节( )
【答案】√
【解析】负数偏移表示向前(朝文件开头方向)移动。
三、填空题(共10空,每空2分,共20分)
31. fputc函数用于向文件写入一个____。
【答案】字符
【解析】fputc(ch,fp)写入一个字符。
32. fgetc函数用于从文件读取一个____。
【答案】字符
【解析】fgetc(fp)读取一个字符。
33. fputs函数用于向文件写入一个____(不含\0)。
【答案】字符串
【解析】fputs(s,fp)写入字符串。
34. fgets函数用于从文件读取一个____(可能含
)。
【答案】字符串
【解析】fgets(s,n,fp)读取字符串。
35. fprintf函数的第一个参数是____指针。
【答案】文件(FILE *)
【解析】fprintf(fp,format,...)。
36. fseek函数的三个参数分别是:文件指针、偏移量和____。
【答案】起始位置(Origin)
【解析】fseek(fp,offset,origin)。
37. ____常量表示从文件开头开始偏移。
【答案】SEEK_SET
【解析】SEEK_SET=0,从开头开始。
38. ____常量表示从文件末尾开始偏移。
【答案】SEEK_END
【解析】SEEK_END=2,从末尾开始。
39. ____函数用于获取文件指针的当前位置。
【答案】ftell
【解析】ftell(fp)返回当前位置。
40. ____函数用于将文件指针重置到文件开头。
【答案】rewind
【解析】rewind(fp)将文件指针移到开头。
四、程序综合题(共3题,每题10分,共30分)
41. 程序填空题:阅读下列程序,请将①~④表示的内容填写完整。
(1) #include <stdio.h>
(2) int main()
(3) {
(4) FILE *fp;
(5) char s[20];
(6) fp=fopen("test.txt","w");
(7) fputs("Hello
",fp);
(8) fputs("World
",fp);
(9) fclose(fp);
(10) fp=fopen("test.txt","r");
(11) fgets(s,20,fp);
(12) printf("%s",s);
(13) fclose(fp);
(14) return 0;
(15) }
上述程序中,第7行fputs的功能是①____,第11行fgets读取最多②____个字符,
第12行输出③____,文件test.txt中共写入④____行。
【答案】① 向文件写入字符串 ② 19 ③ Hello ④ 2
【解析】
① fputs 函数的功能是将字符串写入指定的文件中;
② fgets 读取长度为 20,最多读取 19 个有效字符并自动补结束符;
③ 读取第一行内容 Hello,所以第 12 行输出 Hello;
④ 程序写入两行文本(Hello、World),文件共 2 行。
42.文件social.dat存储员工号和社保缴费金额。按缴费金额降序排列后,统计并输出指定区间内所有员工的员工号。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 200
void sort_soc(int id[],float soc[],int n);
int main()
{
FILE *fp;
int i=0,n,cid[N];
float soc[N];
int L,R;
fp=fopen("social.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d%f",&cid[i],&soc[i]);
①;
}
n=i;
fclose(fp);
sort_soc(cid,soc,n);
scanf("%d%d",&L,&R);
int left=0,right=n-1,first=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(soc[mid]>=L)
{first=mid;right=mid-1;}
else left=mid+1;
}
left=0;right=n-1;int last=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(soc[mid]<=R)
{last=mid;left=mid+1;}
else right=mid-1;
}
if(first!=-1&&last!=-1&&first<=last)
for(i=first;i<=last;i++)
printf("%d
",cid[i]);
}
【答案】① i++
【解析】
① 每读取一条员工社保数据,数组下标 i 自增 1,统计总记录数。
43.文件tax.dat存储纳税人ID和应纳税额。按应纳税额升序排列后,查询并输出区间[L,R]内人数及最高税额对应的纳税人ID。请完善程序。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 150
void bubble_sort(int id[],float tax[],int n);
int main()
{
FILE *fp;
int i=0,n,cid[N];
float tax[N];
int L,R,cnt;
fp=fopen("tax.dat","r");
while(!feof(fp))
{
fscanf(fp,"%d%f",&cid[i],&tax[i]);
①;
}
n=i;
fclose(fp);
bubble_sort(cid,tax,n);
scanf("%d%d",&L,&R);
int left=0,right=n-1,first=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(②)
{first=mid;right=mid-1;}
else left=mid+1;
}
left=0;right=n-1;int last=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(tax[mid]<=R)
{last=mid;left=mid+1;}
else right=mid-1;
}
cnt=0;int maxid=-1;float maxt=0;
for(i=first;i<=last;i++)
{
cnt++;
if(tax[i]>maxt){maxt=tax[i];maxid=cid[i];}
}
printf("%d %d
",cnt,maxid);
}
void bubble_sort(int id[],float tax[],int n)
{
int i,j,tid;
float ttax;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(tax[j]>tax[j+1])
{
ttax=tax[j];tax[j]=tax[j+1];tax[j+1]=ttax;
tid=id[j];id[j]=id[j+1];id[j+1]=tid;
}
}
【答案】① i++ ② tax [mid]>=L
【解析】
① 每读取一条纳税人数据,下标 i 自增 1,统计总人数;
② 二分查找第一个大于等于 L 的位置,用于定位区间起始点。
学科网(北京)股份有限公司
$