C语言文件操作专项练习题
配套知识点:二进制读写、文件光标、定位函数,重点区分文本/二进制模式
一、选择题(1~10)
-
以二进制只写方式打开文件,fopen的打开模式是?(B)
A. “w” B. “wb” C. “rb” D. “a”
//写
以2进制的写
以2进制的读
文本追加 -
fwrite函数的作用是(B)
A. 读取文件数据 B. 将内存数据原样二进制写入文件
C. 移动文件读写光标 D. 获取光标位置
//
有f开头的就是和文件有关的 -
fseek(pf, -4, SEEK_END); 含义(C)
A. 从开头向后移4字节
B. 从当前位置向后移4字节
C. 从文件末尾向前移4字节
D. 光标直接回到文件开头
// 这个只是变换光标的位置,不会有额外的动作 -
rewind(pf); 等价于下面哪一行?(A)
A. fseek(pf,0,SEEK_SET);
B. fseek(pf,0,SEEK_END);
C. ftell(pf);
D. fseek(pf,0,SEEK_CUR);
//rewind是把光标放回字符串首地址 -
ftell函数的功能是(B)
A. 移动文件光标 B. 获取当前光标距离文件开头的字节偏移量
C. 关闭文件 D. 写入二进制数据
//ftell是只是去算偏移量,但是它不会读写,要额外打印那个偏移量出来 -
二进制文件存放5个int(每个int占4字节), fseek(pf,12,SEEK_SET) ,光标指向第几个int?(D)
A. 第1个 B.第2个 C.第3个 D.第4个
//注意:SKT是开头的位置,pf是首字母的地址,所以开头是第一个元素。12byte对应3个int,所以往后移动3个元素,到达第四个元素 -
下面说法错误的是(D)
A. fseek只移动光标,不会读写数据
B. ftell拿到位置,不会自动打印
C. fclose用来关闭文件,释放资源
D. "w"模式是二进制写文件
//wb才是2进制,2进制的英文是binary,所以后面一定有个b -
fread参数顺序正确的是(A)
A. fread(缓冲区地址,单个元素大小,元素个数,文件指针)
B. fread(文件指针,单个元素大小,元素个数,缓冲区地址) -
使用fopen打开文件后,必须调用哪个函数释放资源(C)
A. rewind B. ftell C. fclose D. fseek
//fopwen fclose
macllo feel 这种东西一样都是配套的 -
二进制写入的文件,用记事本打开看到乱码,原因是(B)
A. 文件损坏
B. 写入的是数字原始二进制,不是ASCII字符
C. 代码有语法错误
D. 打开模式写错
二、代码阅读简答题(11~15)
FILE* pf = fopen(“test.bin”,“rb”);
rewind(pf);
long pos = ftell(pf);
pos的值等于多少?
//它rewind直接把那个光标移到第一位,偏移量为0,ftell就读出0来
12. 文件存储5个int:1,2,3,4,5,每个int占4字节。
fseek(pf,-4,SEEK_END);
int val;
fread(&val,sizeof(int),1,pf);
val结果是?
先注意,-4是byte,向前移动4个byte,原来有20个byte,到达第16个byte,因为4个byte为1个int,所以val是5.
c
int arr[]={10,20,30};
FILE* pf = fopen(“bin.bin”,“wb”);
fwrite(arr,sizeof(int),3,pf);
fclose(pf);
这里加进去了12byte
13.fseek会不会取?fseek只移动光标,不取
15. sprintf:转成ASCII文本存入内存char数组,人可读;fwrite直接拷贝内存原始二进制写入文件,不做ASCII转换,记事本打开乱码。
我想说明一个点:int存到计算机是存补码
char存到计算机是转化为ASCLL(然而这个本身就代表了已经编译成2进制的数)
计算机只直到2进制,它压根不知道ASCLL是个什么东西。
sscanf,sprintf它们是把不同类型的元素整合在一起,但是它对int的数字存储方式变了,它是把各个位数的数字单独取出来,编译为ASCLL,然后再存到计算机内部,不是以补码那样存的
4012



被折叠的 条评论
为什么被折叠?



