第九章 预处理命令、位运算和文件_第1页
第九章 预处理命令、位运算和文件_第2页
第九章 预处理命令、位运算和文件_第3页
第九章 预处理命令、位运算和文件_第4页
第九章 预处理命令、位运算和文件_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、9.1 预处理命令预处理命令u作用:作用:对源程序编译之前(预编译)做一些处理对源程序编译之前(预编译)做一些处理,生成扩展生成扩展C源程序源程序。u种类种类宏定义宏定义 #define文件包含文件包含 #include条件编译条件编译 #if-#else-#endif等等9.1 预处理命令预处理命令u格式:格式:“#”开头开头占单独书写行占单独书写行预处理命令预处理命令不是不是C C语句,语句尾不加分号语句,语句尾不加分号9.1.1 宏定义宏定义u不带参数宏定义不带参数宏定义一般形式:一般形式: #define #define 标识符标识符 字符串字符串功能功能: :用指定标识符用指定标识符

2、( (宏名宏名) )代替字符序列代替字符序列( (宏体宏体) )定义位置定义位置:任意任意(一般在函数外面一般在函数外面)作用域作用域:从定义命令到文件结束从定义命令到文件结束一般用大写字母如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);u#undef可可终止宏名作用域终止宏名作用域格式格式: #undef 宏宏名名例 #define YES 1 main() . #undef YES #define YES 0 max() . YES原作用域原作用域YES新作用域新作用域9

3、.1.1 宏定义宏定义如如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”);展开后:展开后: if(x=1) printf(“correct!n”); else if (x=0) printf(“error!n”);u 宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作不作语法检查语法检查u 宏定义可嵌套,不能递归宏定义可嵌套,不能递归例例 #define MAX MAX+10 ( )u 宏定义中使用必要的括号宏定义中使用必要的括号()()例例 #define WIDTH 80 #define L

4、ENGTH (WIDTH+40) var=LENGTH*2;宏展开:宏展开:var= (80+40)*2 ;例例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展开:宏展开:var= 80+40 *2;9.1.1 宏定义宏定义u 带参数宏定义带参数宏定义一般形式:一般形式: #define 宏名宏名(参数表参数表) 字符串字符串v宏展开:宏展开:形参用实参换,其它字符保留形参用实参换,其它字符保留v宏体及各形参外一般应加括号()宏体及各形参外一般应加括号()例例 #define S(a,b) a*b . area=S(3,2);宏

5、展开:宏展开: area=3*2;不能加空格不能加空格9.1.1 宏定义宏定义例例 #define S (r) PI*r*r相当于定义了不带参宏相当于定义了不带参宏S,代表字符串代表字符串“(r) PI*r*r” 例例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展开:宏展开:z=x+y*x+y;一般写成:一般写成: #define POWER(x) (x)*(x)宏展开:宏展开: z=(x+y)*(x+y);9.1.1 宏定义宏定义 下面程序的运行结果是:下面程序的运行结果是:#define DOUBLE( r) r*rmain() int x=

6、1,y=2,t; t=DOUBLE(x+y); printf(%dn,t);5 以下程序的运行结果是:以下程序的运行结果是: #define POWER(x) ((x)*(x)) main() int i=1; while(i(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展开:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的

7、功能先求出a+b的值再传递给形参宏展开时只是进行字符替换,并不求a+b的值u带参的宏与函数区别带参的宏与函数区别带参宏带参宏函数函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参 处理时间编译前程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间u功能:功能:一个源文件可将另一个源文件的内容全一个源文件可将另一个源文件的内容全部包含进来部包含进来u一般形式:一般形式: #include “文件名文件名” 或或 #include 直接按标准目录(库函数头文件所在的目录)搜索“” 先在当前目录(可指定路径)搜索,再搜索标准目录#incl

8、ude “file2.c”file1.cfile2.cfile1.cfile2.cABAu处理过程处理过程:预编译时:预编译时, ,用被包含文件的内容取代该用被包含文件的内容取代该预处理命令,再对预处理命令,再对“包含包含”后的文件作一个源文后的文件作一个源文件编译件编译u被包含文件内容被包含文件内容源文件源文件( (* *.c).c)头部文件头部文件( (* *.h).h)宏定义数据结构定义函数说明等u 文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c例例 文件

9、包含举例文件包含举例#include #include d:fengyibkcpowers.h#define MAX_POWER 10void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=MAX_POWER;n+) printf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n);/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x) (x)*(x

10、)*(x)*(x)下列程序段的输出结果是下列程序段的输出结果是_。#define MM(x,y) (x)+(y)printf(%d, MM(2*3,15)*2); 369.2 位运算位运算u 按位与按位与 ( & )( & )u 按位或按位或 ( | )( | )u 按位取反按位取反 ( )( )u 按位异或按位异或 ( )( )u 左移左移 ( )( )( )u位运算符只能对整型或字符型数据作运算。位运算符只能对整型或字符型数据作运算。除除按位取反按位取反为为单目运算符单目运算符外,其余均为外,其余均为双双目运算符目运算符。u参与运算时,参与运算时,操作数必须先转换成二进制操

11、作数必须先转换成二进制形式形式,然后再执行相应的按位运算。,然后再执行相应的按位运算。9.2.1 位运算符位运算符u 按位与(按位与( & &)(1 1)格式:)格式:x&yx&y(2 2)规则:对应位均为)规则:对应位均为1 1时才为时才为1 1,否则为,否则为0 0 1101 & 1001 1001例如,例如,13&999.2.1 位运算符位运算符(1 1)格式:)格式:x|yx|y(2 2)规则:对应位均为)规则:对应位均为0 0时才为时才为0 0,否则为,否则为1 1如如: 13|9: 13|9 u 按位或(按位或( | | )9.2.1

12、 位运算符位运算符=13 1101 | 1001 1101(1 1)格式:)格式:xx(2 2)规则:各位翻转,即原来为)规则:各位翻转,即原来为1 1的位变成的位变成0 0,原,原来为来为0 0的位变成的位变成1 19.2.1 位运算符位运算符u 按位取反按位取反 ( )( )(1) (1) 格式:格式:xyxy(2) (2) 规则:对应位相同时为规则:对应位相同时为0 0,不同时为,不同时为1 1如如: 139: 139=4u 按位异或按位异或 ( ( ) ) 1101 1001 01009.2.1 位运算符位运算符(1)(1)格式:格式:x x 位数位数(2)(2)规则:使操作数的各位左

13、移,低位补规则:使操作数的各位左移,低位补0 0,高位,高位溢出溢出如:如:525200000000000001010000000000010100位移前位移前位移后位移后提示:向左移提示:向左移n 位,数据位,数据扩大为原来的扩大为原来的n 倍。倍。u 左移左移 ( )(x位数位数规则:使操作数的各位右移,移出的低位舍弃;规则:使操作数的各位右移,移出的低位舍弃;高位按以下方法处理:高位按以下方法处理:(1) 对无符号数和有符号中的正数,对无符号数和有符号中的正数,补补0;(2) 有符号数中的负数有符号数中的负数, 补补1u 右移右移 ( )( )9.2.1 位运算符位运算符例如,例如,20

14、 200000000000001010000000000010100位移前位移前位移后位移后9.2.1 位运算符位运算符u 6种位运算符优先顺序种位运算符优先顺序按位取反:按位取反: 左移左移,按位与:按位与:& &按位异或:按位异或: 按位或:按位或:| |高高低低9.2.1 位运算符位运算符u 与位运算有关的复合的赋值运算符与位运算有关的复合的赋值运算符= ,= ,= , &= , =, |=如:如:a|=ba|=b相当于相当于a=a|ba=a|b9.2.1 位运算符位运算符课堂练习课堂练习(1 1)十进制数表示表达式)十进制数表示表达式“12|01212|012”

15、的运算结果的运算结果是(是( )A) 1A) 1B) 0B) 0C) 14C) 14 D) 16D) 16C课堂练习课堂练习(2 2)设字符型变量)设字符型变量a=3,b=6a=3,b=6,计算表达式,计算表达式c=(c=(abab)2)3后,后,k的值是(的值是( )A) 06B) 0177776C) 066 D) 0177766D 语 言 将 文 件 看 作 是 由 一 个 一 个 的 字 符 语 言 将 文 件 看 作 是 由 一 个 一 个 的 字 符(ASCII码文件)或字节(二进制文件)组成码文件)或字节(二进制文件)组成的。的。9.3 文件文件(1)根据文件编码的方式,可分为)根

16、据文件编码的方式,可分为ASCII文文件件和和二进制文件二进制文件。 ASCII文件又称为文件又称为文本文本文件文件。(2)根据文件的存取形式,可分为)根据文件的存取形式,可分为顺序存取文顺序存取文件件和和随机存取文件随机存取文件。u 文件的分类文件的分类9.3.1 文件和文件指针文件和文件指针(1)按文件的逻辑结构:)按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不记录文件:由具有一定结构的记录组成(定长和不定长)定长)流式文件流式文件:由一个个字符(字节)数据顺序组成:由一个个字符(字节)数据顺序组成(2)按存储介质:)按存储介质:普通文件:存储介质文件(磁盘、磁带等)普通文

17、件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)设备文件:非存储介质(键盘、显示器、打印机等)(3)按数据的组织形式:)按数据的组织形式:文本文件文本文件: ASCII文件,每个字节存放一个字符的文件,每个字节存放一个字符的ASCII码码二进制文件二进制文件:数据按其在内存中的存储形式原样存:数据按其在内存中的存储形式原样存放放u 文件的分类文件的分类9.3.1 文件和文件指针文件和文件指针如如 int型数型数100000010011100010000内存存储形式内存存储形式0010011100010000二进制形式二进制形式0011000100110000001

18、100000011000000110000ASCII形式形式文本文件特点文本文件特点:存储量大、速度慢、便于对字符操作存储量大、速度慢、便于对字符操作二进制文件特点二进制文件特点:存储量小、速度快、便于存放中间结果存储量小、速度快、便于存放中间结果9.3.1 文件和文件指针文件和文件指针语言用一个指针变量指向一个文件,语言用一个指针变量指向一个文件, 这这个指针称为文件指针。个指针称为文件指针。文件文件指针指针定义形式:定义形式: FILE * 指针变量名;指针变量名; u 文件指针文件指针9.3.1 文件和文件指针文件和文件指针9.3.2 文件的打开与关闭文件的打开与关闭u 用用fopen(

19、 )函数打开一个文件函数打开一个文件u 用用fclose( )函数关闭一个文件函数关闭一个文件 1用法:用法: FILE *fp; fp=fopen(文件名,使用文件方式文件名,使用文件方式) ; 如:如: fpfopen(data.out,r); fp= fopen(“h:examfile1.out,rb) fp= fopen(“a:file2.out”, w)9.3.2 文件的打开与关闭文件的打开与关闭2、文件使用方式、文件使用方式使用方式使用方式 意意 义义 “r” 打开一个已经存在的文本文件,只允许读数据打开一个已经存在的文本文件,只允许读数据 “w” 打开或新建一个文本文件,只允许写

20、数据打开或新建一个文本文件,只允许写数据 “a” 打开一个文本文件,并在文件末尾追加数据打开一个文本文件,并在文件末尾追加数据 “r+” 读写打开一个文本文件,允许读和写读写打开一个文本文件,允许读和写 “w+” 读写打开或建立一个文本文件,允许读写读写打开或建立一个文本文件,允许读写 “a+” 读写打开一个文本文件,允许读,或在文件末读写打开一个文本文件,允许读,或在文件末尾追加数据尾追加数据 9.3.2 文件的打开与关闭文件的打开与关闭使用方式使用方式 意意 义义 “rb” 只读打开一个二进制文件,只允许读数据只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只

21、允许写只写打开或建立一个二进制文件,只允许写数据数据 “ab” 追加打开一个二进制文件,并在文件末尾写追加打开一个二进制文件,并在文件末尾写数据数据 “rb+” 读写打开一个二进制文件,允许读和写读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和读写打开或建立一个二进制文件,允许读和写写 “ab+” 读写打开一个二进制文件,允许读,或在文读写打开一个二进制文件,允许读,或在文件末追加数据件末追加数据 9.3.2 文件的打开与关闭文件的打开与关闭2、文件使用方式、文件使用方式 (1) 如果不能打开指定文件,则如果不能打开指定文件,则fopen( )函数返回一函

22、数返回一个个空指针空指针NULL 。 常用的打开文件的方法:常用的打开文件的方法: if(fp=fopen(文件名文件名,操作方式操作方式)=NULL) printf(can not open this filen); exit(0); 3说明说明9.3.2 文件的打开与关闭文件的打开与关闭u关于关于exit()函数函数exit(0)表示程序正常退出表示程序正常退出exit(1)表示程序异常退出表示程序异常退出9.3.2 文件的打开与关闭文件的打开与关闭u 文件的关闭文件的关闭fcolse()函数函数1用法:用法: fclose(文件指针文件指针);2功能:关闭功能:关闭“文件指针文件指针”所

23、指向的文件。所指向的文件。如果正常关闭了文件,则函数返回值为如果正常关闭了文件,则函数返回值为0;否则,返回值为非否则,返回值为非0。如,如,fclose(fp);9.3.2 文件的打开与关闭文件的打开与关闭9.3.3 文件的读写文件的读写文件打开之后,就可以对它进行读与写的操作了。文件打开之后,就可以对它进行读与写的操作了。u读写文件中的一个字符读写文件中的一个字符u读写一个字符串读写一个字符串u数据块的读写数据块的读写u对文件进行格式化读写对文件进行格式化读写u 读写文件中的一个字符读写文件中的一个字符(1)写字符函数)写字符函数(fputc函数函数):把一个字符写到磁把一个字符写到磁盘文

24、件上去。盘文件上去。 调用的一般形式为:调用的一般形式为: fputc(ch,fp);功能:功能:将字符(将字符(ch的值)输出到的值)输出到fp所指向的文所指向的文件上去。件上去。9.3.3 文件的读写文件的读写u 读写文件中的一个字符读写文件中的一个字符(2)读读字符字符函数函数(fgetc函数函数):从从指定文件读入一个指定文件读入一个字符。该文件必须是以读或读写方式打开字符。该文件必须是以读或读写方式打开的的调用调用的一般形式为的一般形式为:ch=fgetc(fp);功能:从功能:从fp所指向的文件所指向的文件上上中读取一个字符中读取一个字符赋给赋给ch变量变量。9.3.3 文件的读写

25、文件的读写u如果想从一个磁盘文件顺序读入字符并在屏幕上如果想从一个磁盘文件顺序读入字符并在屏幕上显示出来,可以:显示出来,可以: ch=fgetc(fp); while (ch!=EOF) putchar(ch); ch=fgetc(fp); 一个文件结束标一个文件结束标志志EOF,EOF在在stdio.h中定中定义为义为-19.3.3 文件的读写文件的读写【例例9.9】编写程序,将字符编写程序,将字符Z,写在文件,写在文件“test.txt”,然后从文件中将此文件读出并在屏幕上显示。然后从文件中将此文件读出并在屏幕上显示。#include void main( ) FILE *fp;fp=f

26、open(d:test.txt,w);fputc(Z,fp); /*将字符将字符Z写入写入test文件中文件中*/fclose(fp);fp=fopen(d :test.txt,r);putchar(fgetc( fp); /*读读test文件中的字符并输出到屏幕上文件中的字符并输出到屏幕上*/close(fp);运行程序运行程序9.3.3 文件的读写文件的读写u 读写一个字符串读写一个字符串1、 fgets()函数函数功能功能: 从指定的文件中读一个字符串到字符从指定的文件中读一个字符串到字符数组中数组中函数调用的形式为:函数调用的形式为: fgets(字符数组名,字符数组名,n,文件指针,

27、文件指针); 其中其中n是一个正整数。表示从文件中读出的是一个正整数。表示从文件中读出的字符串不超过字符串不超过 n-1个字符。在读入的最后一个字符。在读入的最后一个字符后加上串结束标志个字符后加上串结束标志0。9.3.3 文件的读写文件的读写(2) fputs函数函数功能:向指定的文件写入一个字符串功能:向指定的文件写入一个字符串调用形式为:调用形式为: fputs(字符串,文件指针字符串,文件指针) 其中字符串可以是字符串常量,也可以其中字符串可以是字符串常量,也可以是字符数组名,或指针变量是字符数组名,或指针变量例如:例如:fputs(“abcd“,fp); 9.3.3 文件的读写文件的

28、读写【例例9.10】已知已知test.txt文件中包含字符串文件中包含字符串“C program!”,利用,利用fgets函数,读取该文本文件。函数,读取该文本文件。#include #include void main( ) FILE *fp; char str50; if (in=fopen(test.txt, w)= =NULL) printf(cannot open the %sn); exit(1); fgets(str,11,fp);printf(n%s,str);fclose (fp);9.3.3 文件的读写文件的读写运行程序运行程序u 数据块的读写数据块的读写1. 数据块的写文

29、件函数数据块的写文件函数fwrite( ) 调用格式:调用格式:fwrite(buffer, size, count, fp);2. 数据块的读文件函数数据块的读文件函数fread( ) 调用格式:调用格式:fread(buffer, size, count, fp);9.3.3 文件的读写文件的读写【例例9.11】编写程序,将数组中的数写进文件编写程序,将数组中的数写进文件“test.txt”中。中。#include void main() int x5=1,2,3,4,5,i; FILE *fp; fp=fopen( d:test.txt,wb ); for(i=0;i5;i+) /*将数

30、组中的元素写进文件中将数组中的元素写进文件中*/ fwrite(&xi,sizeof(int),1,fp); fclose(fp); 9.3.3 文件的读写文件的读写运行程序运行程序【例【例9.12】从例】从例9.11建立的建立的test文件中读出数据,并输出到屏文件中读出数据,并输出到屏幕上。幕上。#include void main() int y5,i; FILE *fp; fp=fopen(d:test.txt,rb ); for(i=0;i5;i+) /*将文件中的数据读出存放于数组中将文件中的数据读出存放于数组中*/ fread(y,sizeof(int),5,fp); f

31、close(fp); for(i=0;i5;i+) /*在屏幕上输出数组中的元素在屏幕上输出数组中的元素*/ printf(n%d,yi);9.3.3 文件的读写文件的读写运行程序运行程序u 对文件进行格式化读写对文件进行格式化读写fscanf函数,函数,fprintf函数与前面使用的函数与前面使用的scanf和和printf 函数的功能相似,都是格式化读写函数。函数的功能相似,都是格式化读写函数。 两者的区别在于两者的区别在于 fscanf 函数和函数和fprintf函数的函数的读读写对象不是键盘和显示器,而是磁盘文件写对象不是键盘和显示器,而是磁盘文件。 9.3.3 文件的读写文件的读写u

32、格式化读写文件的函数调用格式为:格式化读写文件的函数调用格式为:fscanf(文件指针,格式字符串,输入表列文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列文件指针,格式字符串,输出表列); fscanf(fp,%d%s,&i,s);fprintf(fp,%d%c,j,ch); 9.3.3 文件的读写文件的读写【例例9.13】应用应用fprintf 函数,建立和读取文本文件内容。函数,建立和读取文本文件内容。#include void main() FILE *fp; long a2=1234,5678; if (fp=fopen(d:test.txt

33、,w)=NULL) printf(“cannot open filen”); exit(0); fprintf(fp,%ld,%ldn,a0,a1); fclose(fp);9.3.3 文件的读写文件的读写运行程序运行程序【例例9.14】打开例打开例9.11使用的文件,应用使用的文件,应用 fsanf函数读取文本函数读取文本文件内容。文件内容。#include void main() FILE *fp; long a2; if (fp=fopen(d:test.txt,r)=NULL) printf(“cannot open filen”); exit(0); fscanf(fp,%ld,%l

34、d,&a0,&a1); printf(%ld,%ldn,a0,a1); fclose(fp);9.3.3 文件的读写文件的读写运行程序运行程序9.3.4 文件的定位文件的定位u位置指针复位函数位置指针复位函数rewind()u随机读写与随机读写与fseek()函数函数u返回文件当前位置的函数返回文件当前位置的函数ftell()u位置指针复位函数位置指针复位函数rewind() 1用法:用法:rewind(文件指针文件指针); 2功能:使文件的位置指针返回到文件头。功能:使文件的位置指针返回到文件头。9.3.4 文件的定位文件的定位【例例9.15】利用利用rewind函数,将文件

35、函数,将文件text.txt中的内容两次输出。中的内容两次输出。#include void main( ) FILE *fp; fp1=fopen(d:test.txt, r+); while(!feof(fp) putchar(fgetc(fp); rewind(fp1); while(!feof(p1) putcchar(fgetc(fp); fclose(fp1); 9.3.3 文件的读写文件的读写运行程序运行程序(1)功能功能:使使位置指针移到距起始点偏移位置指针移到距起始点偏移w个个字节处。字节处。(2)用法)用法: fseek(文件指针,位移量,起始点文件指针,位移量,起始点);9

36、.3.4 文件的定位文件的定位ufseek函数函数 起始点的类型:起始点的类型: SEEK_SET0 文件头,文件头, SEEK_CUR1 当前位置,当前位置, SEEK_END2 文件尾文件尾 位移量:以起始点为起点,前进或后退位移量:以起始点为起点,前进或后退n个字节。个字节。注意:位移量为注意:位移量为long int型数据。型数据。 例:例:fseek(fp,10L,0)【例例9.16】根据例根据例9.24和和9.25的例子中文件,将此文件的例子中文件,将此文件d:text.txt中的数据输入文件中,并在屏幕上显示出来。中的数据输入文件中,并在屏幕上显示出来。#include void main( ) int i; FILE *fp; int y5; if(fp=fopen(d:text.txt,rb)= =NULL) printf(cannot open filen); exit(0); for(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论