scanf(\
for(i=31;i>=0;i--){ b[i]=(char)((a&1)+'0');a=a>>1; } puts(b); }
5.输入1个short类型数据,显示它二进制数奇数位(即从左边起的第1、3、5、??、15位)。
解答:#include
void main()
{ short a,i; char b[9]={'\\0'}; scanf(\
for(i=7;i>=0;i--){ b[i]=(char)((a&1)+'0');a=a>>2; } puts(b); }
6.输入一个整数,将其低8位全置1,高8位保留,并以十六进制输出该数。
解答:#include
{ int a; scanf(\
a=a|0xff; printf(\ }
习 题 十一
⒈ 写出下列fopen函数调用所打开文件的读写方式与文件存储格式。
⑴ fpt=fopen(\⑵ fpt=fopen(\⑶ fpt=fopen(\⑷ fpt=fopen(\⑸ fpt=fopen(\
解答:⑴ 新建文本文件 ⑵ 新建二进制文件 ⑶ 可读写文本文件 ⑷ 追加记录二进制文件 ⑸ 新建可读写文本文件 ⒉ 填空题
⑴ fopen函数的返回值是 文件读写的首地址或NULL 。
⑵ 文件打开方式为\,文件打开后,文件读写位置在 文件的首纪录前 。 ⑶ 文件打开方式为\,文件打开后,文件读写位置在 文件的末纪录后 。 ⑷ 表达式“fgetc(fpn)”的值为 所读入字符的ASCII值 或 EOF 。 ⑸ 表达式“fgets(a,10,fpn)”的值为 字符串a的地址 或 NULL 。 ⑹ 函数fscanf的返回值为 所读入数据个数 或 EOF 。 ⑺ 函数fread的返回值为所读入数据的个数或 0 。
⑻ 表达式“fscanf(fpn,\”的值为-1时,函数feof()的值为 1 。 3. 编程,输入若干同学的姓名、学号、3门功课成绩,写到文本文件e:\\aaa.txt。
解答:
#include
36
struct stu{char name[9];char numb[9];int score[3];} void main()
{ FILE *fp1; struct stu a; int i,n;
fp1=fopen(\ for(i=1;i<=n;i++) {
scanf(\
fprintf(fp1,\
/* 格式串中各格式符间有空格,在从文件读入数据时可作为间隔符 */ }
fclose(fp1); } 4. 编程,顺序读入题3所建立文本文件中各个同学的姓名、学号、成绩,显示输出。
解答: #include
struct stu{char name[9];char numb[9]; int score[3];}; void main()
{ FILE *fp1; struct stu a;
fp1=fopen(\
while(fscanf(fp1,\ &a.score[1],&a.score[2])!=EOF)
printf(\ a.score[1],a.score[2]); fclose(fp1);
} /* 应参照(题3)文件中数据存储格式,确定读文件时的格式符 */ 5. 编程,输入1个同学的学号,从题3所建立的文本文件中删除该同学的信息。
解答: #include
struct stu{char name[9];char numb[9]; int score[3];}; void main()
{ FILE *fp1,*fp2; struct stu a; char x[9]; gets(x);
fp1=fopen(\ while(fscanf(fp1,\ &a.score[1],&a.score[2])!=EOF)
if(strcmp(a.numb,x))fprintf(fp2,\ a.score[0],a.score[1],a.score[2]); fclose(fp1);fclose(fp2);
remove(\ } 6. 编程,读入若干行字符(每行不超过80个),写入文本文件e:\\bbb.txt。
解答: #include
{ FILE *fp; char a[81];
fp=fopen(\
while(gets(a)!=NULL) { fputs(a,fp); fputc('\\n',fp); }
37
fclose(fp); /* 加入换行符,作为间隔符 */ }
7. 文件a.txt、b.txt中各自存放了若干个整数,编程,显示在a.txt中存在而b.txt中不存在的那些数。
解答: #include
{ FILE *fa,*fb; int a,b;
fa=fopen(\ while(!feof(fa)) { fscanf(fa,\ while(!feof(fb)) {
fscanf(fb,\ }
if(feof(fb)) printf(\ rewind(fb); }
fclose(fa); fclose(fb); }
8. 编程,输入若干同学的姓名、学号、3门功课成绩,写到二进制文件中(文件名自定)。
解答: #include
{ FILE *fp; char name[9],numb[9]; int i,n,score[3]; fp=fopen(\ for(i=1;i<=n;i++) {
scanf(\ fwrite(name,sizeof(name),1,fp); fwrite(numb,sizeof(numb),1,fp); fwrite(score,sizeof(int),3,fp); }
rewind(fp); /* 下面的读文件程序段不是必须的,只是为验证输入是否正确 */
while(fread(name,sizeof(name),1,fp)!=NULL) {
fread(numb,sizeof(numb),1,fp); fread(score,sizeof(int),3,fp);
printf(\
} } 9. 编程,输入1个同学的姓名、学号、3门功课成绩,修改题8所建立的二进制文件中具有相同学号同学的信息。
解答: #include
{ FILE *f1,*f2; char name[2][9],numb[2][9]; int s[2][3];
f1=fopen(\ scanf(\
38
while(fread(name[1],sizeof(name[1]),1,f1)!=NULL) { fread(numb[1],sizeof(numb[1]),1,f1); fread(s[1],sizeof(int),3,f1);
if(strcmp(numb[0],numb[1])) {
fwrite(name[1],sizeof(name[1]),1,f2); fwrite(numb[1],sizeof(numb[1]),1,f2); fwrite(s[1],sizeof(int),3,f2); }
else {
fwrite(name[0],sizeof(name[0]),1,f2); fwrite(numb[0],sizeof(numb[0]),1,f2); fwrite(s[0],sizeof(int),3,f2); } }
fclose(f1);fclose(f2);
remove(\ /* 下面的读文件程序段不是必须的,只是为验证输入是否正确 */ f2=fopen(\
while(fread(name[0],sizeof(name[0]),1,f2)!=NULL) { fread(numb[0],sizeof(numb[0]),1,f2); fread(s[0],sizeof(int),3,f2);
printf(\
}
fclose(f2); } 10. 编程,模仿第10章例8,利用按位异或对某一文件加密与解密。
解答: #include
{ char a; int m1,m2,i; FILE *p1,*p2;
printf(\输入一个整数密值(1~255):\\n\ p1=fopen(\ while((a=fgetc(p1))!=EOF) fputc(a^m1,p2);
fclose(p1); fclose(p2); p2=fopen(\ while((a=fgetc(p2))!=EOF) putchar(a^m1); fclose(p2); }
11.文本文件a.txt、b.txt每行存放一个数且均按从小到大存放。下列程序将这两文件中数据合并到c.txt,文件c.txt中数据也要从小到大存放,填空将程序补充完整、正确。
说明:若文件a.txt数据为1↙6↙9↙18↙27↙35↙,b.txt数据为10↙23↙25↙39↙61↙,则文件c.txt中数据应为1↙6↙9↙10↙18↙23↙25↙27↙35↙39↙61。
解答: #include
{ FILE *f1,*f2,*f3; int x,y;
f1=fopen(\
39
⑴ f3=fopen(\
fscanf(f1,\ while(1) if(⑵ x else { fprintf(f3,\ if( ⑶ feof(f1) ) { fprintf(f3,\ while(fscanf(f2,\⑷ fprintf(f3,\ } else { ⑸ fprintf(f3,\ while(fscanf(f1,\ } fclose(f1); fclose(f2); fclose(f3); } 40