前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全国二级C知识点总结7-编译预处理、文件

全国二级C知识点总结7-编译预处理、文件

作者头像
用户6755376
发布2019-12-18 10:58:33
6990
发布2019-12-18 10:58:33
举报

本课重要知识点:

1.知识点:main()函数的参数

l 定义形式:main(int argc,char *argv[])

{…

}

l int argc是命令行中的字符串数,char *argv[]是指向字符串的指针数组,系统使用空格把各个字符串隔开。

2.知识点:不带参数的宏定义

l 一般形式:#define 宏名 字符串(或数值)

即用字符串或数值取代宏名。

l 宏名一般采用大写字母表示,以与变量名区别,也可用小写字母。

l 宏定义不是C语句,不必在行末加分号

例1:(2009-04-36)有以下程序

#include<stdio.h>

#define PT 3.5;

#define S(x) PT*x*x;

main()

{int a=l,b=2;printf("%4.1f\n",S(a+b));}

程序运行后输出的结果是(D)

A)14.0 B)31.5 C)7.5 D)程序有错无输出结果

【解析】此题考查宏的定义形式。由于宏定义并不是语句,故#define后面不能有分号,故该程序有错无法输出结果,所以,正确答案:D。

例2:(2011-03-30)以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。

#define N 10

void fun(int x[N])

{ inti=0;

while(i<N)scanf(“%d”,_________);

}在程序中下划线处应填入的是

A)x+i B)&x[i+1] C)x+(i++) D)&x[++i]

答案:C

【解析】要求给每个元素赋值,while循环的变量i必须不断增加,所以A、B显然不行,i++是先参与运算在自增1,++i是先自增1再参与运算,所以D会出现x[0]未赋值的情况,故选C。

l 对程序中用“”括起来的字符串内的字符,即使与宏名相同,也不进行置换。

l 宏定义可以嵌套使用,例如:

#define R 3.0

#define PI 3.14159

#define L L*PI*R

3.知识点:带参数的宏定义

l 一般形式:#define 宏名(参数表) 字符串

l 带参数的宏不占运行时间,只占编译时间;只是简单、机械字符替换;宏名无类型。

l 要注意有括号和没括号的区别

例1:(2009-09-35)有以下程序

#include <stdio.h>

#define f(x) x*x*x

main()

{int a=3,s,t;

s=f(a+1); t=f((a+1));

printf(“%d,%d\n”,s,t);

}程序运行后的输出结果是(A)

A)10,64 B)10,10 C)64,10 D)64,64

【解析】本题考点为带参数的宏定义,宏定义中的参数没有类型,仅为字符序列,不能当作表达式运算。宏展开时,把实参字符串原样写在替换文本中。s=f(a+1)=a+1*a1*a+1=10;t=f((a+1))= (a+1)* (a+1)* (a+1)=64

例2:(2011-03-35)有以下程序

#define S(x) 4*(x)*x+1

main()

{ intk=5,j=2;

printf("%d\n",S(k+j));

}程序运行后的输出结果是(B)

A)197 B)143 C)33 D)28

【解析】#define宏定义,只是机械简单的置换S(k+j)=S(5+2)=4*(5+2)*5+2+1=143

4.知识点:文件包含

l 一般形式:#include <文件名>或者#include “文件名”

l < >与” ”的区别:<>即系统到存放C库函数头文件的目录中寻找要包含的文件;” ”即系统先在用户当前目录中寻找,若找不到,再到存放C库函数头文件的目录中寻找。

l 文件包含可以嵌套。

l 凡是以“#”开头的行都是预处理命令行。

5.知识点:calloc()函数

l 函数原型:void *calloc(unsigned n,unsigned size);

l 功能:分配n个数据项的内存连续空间,每个数据项的大小为size

6.知识点:free()函数

l 函数原型:void free(void *p);

l 功能:释放p所指的内存区

7.知识点:malloc()函数

l 函数原型:void *malloc(unsigned size);

l 功能:分配size字节的存储区

例1:(2011-03-14)以下程序运行后的输出结果是 emoclew

main()

{ char *p; int i;

p=(char *)malloc(sizeof(char)*20);

strcpy(p,"welcome");

for(i=6;i>=0;i--) putchar(*(p+i));

printf("\n"); free(p);

}

【解析】(char*)malloc(sizeof(char)*20)申请一个20个字符大小的空间,首地址赋给字符指针变量p,strcpy(p,"welcome");将字符串"welcome"赋值给p所指向的空间,for循环实现从后往前输出这个字符串,free(p)为释放申请的空间。

8.知识点:文件的概念和文件指针

l 在C程序中文件可以用顺序方式存取,可以用随机方式存取。

l C程序把文件分为ASCII文件(文本文件)和二进制文件。

例1:(2009-09-40)下列关于C语言文件的叙述中正确的是(C)

A)文件由一系列数据依次排列组成,只能构成二进制文件

B)文件由结构序列组成,可以构成二进制文件或文本文件

C)文件由数据序列组成,可以构成二进制文件或文本文件

D)文件由字符序列组成,其类型只能是文本文件

【解析】本题考点为文件的基本概念。正确答案为C。C语言中根据数据的组织形式,分为二进制文件和ASCII码文件。一个C文件时一个字节序列或者二进制序列,而不是一个记录(结构)序列。

l 文件类型指针:FILE *fp;fp是一个指向FILE类型结构体的指针变量,通过文件指针变量找到与它相关的文件。

例2:(2010-09-15)以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。

#include <stdio.h>

main()

{ FILE *fp;

char a[5]={‘1’,’2’,’3’,’4’,’5’},i;

fp=fopen(“f.txt”,”w”);

for(i=0;i<5;i++)fputc(a[i],fp);

fclose(fp);

}

9.知识点:fopen()函数和fclose()函数

(1)fopen函数

l 调用方式:fp=fopen(“file1”,”r”);

l 使用文件方式:如”r”只读打开一个文本文;”w”只写打开或建立一个文本文件;”a”追加打开一个文本文件,在文件末尾添加数据。

例1:(2011-03-40)设fp已定义,执行语句fp=fopen("file","w");后,以下针对文本文件file操作叙述的选项中正确的是(B)

A)写操作结束后可以从头开始读 B)只能写不能读

C)可以在原有内容后追加写 D)可以随意读和写

【解析】文件打开方式,‘w’只能向该文件写入,如打开的文件不存在则以指定的文件名建立文件,如存在,则先删除再重建一个文件。故选B。

l 若不能实现打开任务,fopen函数将带回一个空指针值NULL。

例1:(2009-04-13)以下程序用来判断指定文件是否能正常打开,请填空。

#include <stdio.h>

main()

{FILE *fp;

if(((fp=fopen(“test.txt”,”r”))== NULL ))

printf(“未能打开文件!\n);

else

printf(“文件打开成功!\n”);

}

【解析】考查文件打开操作。打开文件使用fopen函数,正常打开时返回指向该文件的文件指针,否则返回值为NULL;题目中当if条件表达式成立时,输出“未能打开文件!”,故fopen函数返回值为NULL。正确答案:NULL。

(2)fclose()函数

l 调用方式:fclose(fp);

l 顺利完成关闭操作,返回值为0,否则返回EOF(-1)。

10.知识点:fputc()函数和fgetc()函数

l fgetc()函数的调用形式:ch=fgetc(fp);从打开的文件fp中读取一个字符。

l fputc()函数的调用形式:fputc(ch,fp);将字符输出到fp所指向的文件中去。

11.知识点:fread()函数和fwrite()函数

l fread()函数的调用形式:fread(buffer,size,count,fp);其中buffer是一个指针,size是每个数据块的字节数,count是每次读入数据块的个数,fp是文件指针。

例1:structstud

{char name[10];

int num;

}stu[40];

假设学生的数据已存放在磁盘文件中,如何读入40个学生的数据?

for(i=0;i<40;i++)

fread( &stu[i] , sizeof(struct stur) ,1,fp);

l fwrite()函数的调用形式:fread(buffer,size,count,fp);其中buffer是输出数据的首地址。

12.知识点:fscanf()函数和fprintf()函数

l fscanf(文件指针,格式控制字符串,输入列表);

l fprintf(文件指针,格式控制字符串,输出列表);

例1:(2011-09-40)有以下程序

#include<stdio.h>

main()

{FILE *fp;

int k,n,i,a[6]={1,2,3,4,5,6};

fp=fopen(“d2.dat”,”w”);

for(i=0;i<6;i++)fprintf(fp,”%d\n”,a[i]);

fclose(fp);

fp=fopen(“d2.dat”,”r”);

for(i=0;i<3;i++) fscanf(fp,”%d%d”,&k,&n);

fclose(fp);

printf(“%d,%d\n”,k,n);

}程序运行后的输出结果是 (C)

A.1,2 B.3,4 C.5,6 D.123,456

【解析】第一次fp=fopen(“d2.dat”,”w”);以写方式打开,通过循环将a数组全部写入文件中,并且每行写一个;第二次fp=fopen(“d2.dat”,”r”); 以写方式打开,然后通过循环每次读取两个数字给k和n,第三次k和n分别得到5和6

例1:(2009-04-40)有以下程序

#include <stdio.h>

main()

{FILE *f;

f=fopen(“filea.txt”,”w”);

fprintf(f,”abc”);

fclose(f);

}若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt的内容为(C)

A)helloabc B)abclo C)abc D)abchello

【解析】程序中定义了一个文件指针,然后用fopen()函数,以写的方式打开文件“filea.txt”,并让指针f指向它,执着调用fprintf()函数,将“abc”写到指针所指向的文件中。由于filea.txt里原来的内容”hello”被”abc”覆盖掉,所以文件“filea.txt”里,最后的内容为”abc”,本题答案选C。

13.知识点:fgets()函数和fputs()函数

l fgets(str,n,fp);从fp指向的文件输入n-1个字符,在最后加一个’\0’,得到字符串共有n个字符,把它们放到字符数组str中。

l fputs(“China”,fp);把字符串”China”输出到fp指向的文件,字符串末尾’\0’不输出。

(2010-03-40)有以下程序

#include <stdio.h>

main()

{FILE *fp;char str[10];

fp=fopen(“myfile.dat”,”w”);

fputs(“abc”,fp);fclose(fp);

fp=fopen(“myfile,data”,”a+”);

fprintf(fp,”%d”,28);

rewind(fp);

fscanf(fp,”%s”,str);puts(str);

fclose(fp);

}程序运行后的输出结果是(C)

A)abc B)28c C)abc28 D)因类型不一致而出错

【解析】以“a+”方式打开一个已存在的文件,原有文件内容不被删除,位置指针移到文件末尾,可作添加和读操作。fputs(“abc”,fp);把字符串”abc”输出到fp指向的文件。

14.知识点:rewind()函数

l 调用形式:rewind(fp);

l 功能:使位置指针重新返回文件的开头。

15.知识点:fseek()函数

l 功能:改变文件的位置指针

l 调用形式:fseek(fp,100L,0);将位置指针移到离文件头100个字节处。

l 文件首 SEEK_SET 0 文件当前位置 SEEK_CUR 1

文件末尾 SEEK_END 2

16.知识点:ftell()函数

l ftell(fp);

l 功能:得到流式文件中的当前位置。

17.知识点:feof()函数

l feof(fp);

l 判断文件是否结束,结束,返回值为1,否则为0。

例1(2011-03-15)以下程序运行后的输出结果是 【15】 。

main()

{ FILE *fp; int x[6]={1,2,3,4,5,6},i;

fp=fopen("test.dat","wb");

fwrite(x,sizeof(int),3,fp);

rewind(fp);

fread(x,sizeof(int),3,fp);

for(i=0;i<6;i++)printf("%d",x[i]);

printf("\n");

fclose(fp);

}

答案:123456

【解析】fwrite(x,sizeof(int),3,fp);将数组内的前三个元素即1,2,3输出到文件中去,rewind(fp);文件回到开头,fread(x,sizeof(int),3,fp);将文件的内容读出并存到x数组的前三个元素中,把1,2,3写到数组的前三个元素中去,所有数组中的元素值均没变。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机二级C语言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档