12第十二章位运算

上传人:pu****.1 文档编号:568633879 上传时间:2024-07-25 格式:PPT 页数:84 大小:1.49MB
返回 下载 相关 举报
12第十二章位运算_第1页
第1页 / 共84页
12第十二章位运算_第2页
第2页 / 共84页
12第十二章位运算_第3页
第3页 / 共84页
12第十二章位运算_第4页
第4页 / 共84页
12第十二章位运算_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《12第十二章位运算》由会员分享,可在线阅读,更多相关《12第十二章位运算(84页珍藏版)》请在金锄头文库上搜索。

1、第十二章l 主要内容主要内容12.112.1位运算符和位运算位运算符和位运算12.212.2位运算举例位运算举例12.312.3位段位段 概念概念l 位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。l 例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。l 语言提供位运算的功能,与其他高级语言(如PASCAL)相比,具有很大的优越性。 12.1 位运算符和位运算运算符 含义 运算符 含义 按位与 取反 | 按位或 右移(1)位运算符中除以外,均为二目(元)运算符,即要求两侧各有一个运算量。(2)运算量只能是整型或字符型的数据,不能为实型数据。语言提供的

2、位运算符有: 说明: 12.1.1“按位与”运算符()按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。即:,例:例:并不等于,应该是按位与运算:注意:如果参加如果参加& &运算的是运算的是负数(如负数(如-3&-5-3&-5),则要以),则要以补码形式表示为二进制数,补码形式表示为二进制数,然后再按位进行然后再按位进行“与与”运运算。算。 00000011(3)& & 00000101(5) 00000001(1) 3&5的值得按位与的用途: 若想对一个存储单元清零,即使其全部二进制位为,只要找一个二进制数,其中各个位符合以下条件

3、:原来的数中为的位,新数中相应位为。然后使二者进行运算,即可达到清零目的。(1) 清零。 例:例: 原有数为,另找一个数,设它为,这样在原数为的位置上,该数的相应位值均为。将这两个数进行运算: 00101011& & 10010100 00000000 (2) 取一个数中某些指定位。 如有一个整数(个字节),想要取其如有一个整数(个字节),想要取其中的低字节,只需将与中的低字节,只需将与8 8个个1 1按位与即可。按位与即可。 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0abc0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 1 0

4、 1 0 1 1 0 0 (3)保留一位的方法:与一个数进行运算,此数在该位取。即:a=84,b=59 c=a&b=16例:例:有一数,想把其中左面第、位保留下来,运算如下: 01010100(84)& & 00111011(59) 00010000(16) 12.1.2 “按位或”运算符(|) 两个相应的二进制位中只要有一个为,该位的结果值为。即 |,|,|,|例:例: 060|017,将八进制数60与八进制数17进行按位或运算。 00110000| 00001111 00111111 应用:应用:按位或运算常用来对一个数据的某按位或运算常用来对一个数据的某些位定值为。例如:如果想使一个数些

5、位定值为。例如:如果想使一个数的低位改为,只需将与进行的低位改为,只需将与进行按位或运算即可。按位或运算即可。例:例: 是一个整数(位),是一个整数(位), 有表达式:有表达式: | | 则低位全置为,高位保留原样。则低位全置为,高位保留原样。12.1.3“异或”运算符() 异或运算符也称XOR运算符。它的规则是:若参加运算的两个二进制位同号则结果为(假) 异号则结果为(真)即:00=0,01=1,10=1, 11=0即即:071052=023 :071052=023 (八进制数)(八进制数) 00111001 00101010 00010011 例:例:()() 使特定位翻转使特定位翻转设有

6、,想使其低位翻转,即变为,变为。可以将它与进行运算,即:运算符应用:运算符应用: 01111010 00001111 01110101 运算结果的低位正好是原数低位的翻转。可见,要使哪几位翻转就将与其进行运算的该几位置为即可。因为原数中的与进行运算得,得,故保留原数。例如:01200=012()() 与相与相,保留原值,保留原值 00001010 00000000 00001010() 交换两个值,不用临时变量例如:,。想将和的值互换,可以用以下赋值语句实现:ab;ba;ab; () (ab的结果,a已变成)() (ba的结果,b已变成)() (ab的结果,a已变成) 执行前两个赋值语句:“;

7、”和“;”相当于b=b(ab)。 再执行第三个赋值语句: 。由于a的值等于(),b的值等于(),因此,相当于a=,即a的值等于,等于。 得到原来的值。即等效于以下两步: 12.1.4 “取反”运算符() 是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,将变。例如,是对八进制数(即二进制数)按位求反。 0000000000010101() 1111111111101010 (八进制数八进制数177752)177752) 12.1.5 左移运算符() 左移运算符是用来将一个数的各二进制位全部左移若干位。 例如:a=) 右移运算符是a2表示将a的各二进制位右移2位,移到右端的低位被舍弃,

8、对无符号数,高位补0。例如:a=017时: a的值用二进制形式表示为00001111, 舍弃低2位11: a2=00000011右移一位相当于除以右移一位相当于除以2 2 右移右移n n位相当于除以位相当于除以2n2n。 在右移时,需要注意符号位问题: 对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑右移”,即简单右移;移入1的称为“算术右移”。 例:例: a的值是八进制数113755: a:1001011111101

9、101 (用二进制形式表示)a1: 0100101111110110 (逻辑右移时)a1: 1100101111110110 (算术右移时) 在有些系统中,a1得八进制数045766,而在另一些系统上可能得到的是145766。Turbo C和其他一些C编译采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。12.1.7 12.1.7 位运算赋值运算符位运算赋值运算符 位运算符与赋值运算符可以组成复合赋值运算符。 例如: &=, |=, =, =, =例: a & = b相当于 a = a & b a =2相当于a = a 4 目的是使要取出的那几位移到最右端 未右移时

10、的情况 右移4位后的情况 设置一个低4位全为1,其余全为0的数。 ( 0 4) & ( 0 4 )程序如下:#include void main() unsigned a,b,c,d; scanf(“%o”,&a); b=a4; c=(04); d=b&c; printf(“%o,%dn%o,%dn”,a,a,d,d);运行情况如下:(输入), 217 (的值), 13 (的值) 输入的值为八进制数331, 其二进制形式为11011001 经运算最后得到的d为00001101 即八进制数,十进制数13。例12.2 循环移位。要求将进行右循环移位 将右循环移位,即将中原来左面()位右移位,原来右

11、端位移到最左面位。 将的右端位先放到中的高位中,实现语句:(); 将右移位,其左面高位位补,实现语句:; 将与进行按位或运算,即|;步骤: 程序如下:#include void main() unsigned a,b,c; int n; scanf(“a=%o,n=%d”,&a,&n); b=an; c=c|b; printf(“%on%o”,a,c);运行情况如下:, 3 运行开始时输入八进制数运行开始时输入八进制数157653157653,即二进制数即二进制数11011111101010111101111110101011循环右移位后得二进制数循环右移位后得二进制数011110111111

12、01010111101111110101即八进制数即八进制数7576575765 12.3 位段 信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,“真”或“假”用或表示,只需位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。(1)可以人为地将一个整型变量data分为几部分。 但是用这种方法给一个字节中某几位赋值太麻烦。可以位段结构体的方法。 怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢?可以用以下两种方法:(2)位段 C语言允许在一个结构体中以位为单位来指定其成员所占内存

13、长度,这种以位为单位的成员称为“位段”或称“位域” ( bit field) 。利用位段能够用较少的位数存储数据。 程序如下:struct packed-data unsigned :; unsigned:; unsigned:; unsigned:; int ; data; (1)位段成员的类型必须指定为unsigned或int类型。(2) 若某一位段要从另一个字开始存放,可用以下形式定义:unsigned :1;unsignedb:;一个存储单元 unsigned:;unsigned:;另一存储单元 a、b、c应连续存放在一个存储单元中,由于用了长度为的位段,其作用是使下一个位段从下一个存

14、储单元开始存放。因此,只将a、b存储在一个存储单元中,c另存在下一个单元(“存储单元”可能是一个字节,也可能是2个字节,视不同的编译系统而异)。 关于位段的定义和引用的说明:(3) 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。(4) 可以定义无名位段。(5) 位段的长度不能大于存储单元的长度,也不能定义位段数组。(6) 位段可以用整型格式符输出。(7) 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。 关于位段的定义和引用的说明:第十三章l 本章要点本章要点n n 文件的基本概念文件的基本概念文件的

15、基本概念文件的基本概念n n 文件的基本函数文件的基本函数文件的基本函数文件的基本函数n n 文件的顺序读写文件的顺序读写文件的顺序读写文件的顺序读写n n 文件的随机读写文件的随机读写文件的随机读写文件的随机读写n 文件简单应用文件简单应用l 主要内容主要内容13.1 13.1 文件概述文件概述13.2 13.2 文件类型指针文件类型指针13.3 13.3 文件的打开与关闭文件的打开与关闭13.4 13.4 文件的读写文件的读写13.5 13.5 文件的定位文件的定位13.6 13.6 出错的检测出错的检测13.7 13.7 文件输入输出小结文件输入输出小结 13.1 C文件概述文件:文件指

16、存储在外部介质(如磁盘磁带)上数据的集合。 操作系统是以文件为单位对数据进行管理的。文件文件程序程序数据区数据区输输出出文件缓冲区文件缓冲区输输入入文件缓冲区文件缓冲区13.1 C文件概述(续)文件的分类从用户观点:特殊文件(标准输入输出文件或标准设备文件)。普通文件(磁盘文件)。从操作系统的角度看,每一个与主机相连的输入输出设备看作是一个文件。例:输入文件:终端键盘 输出文件:显示屏和打印机文件的分类按数据的组织形式:ASCII文件(文本文件):每一个字节放一个ASCII代码二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。例:整数10000在内存中的存储形式以及分别按A

17、SCII码形式和二进制形式输出如下图所示:13.1 C文件概述(续)13.1 C文件概述(续)文件的分类ASCII文件和二进制文件的比较:ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存。13.1 C文件概述(续)文件的分类C语言对文件的处理方法:缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。非缓冲文件系统:

18、系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。13.1 C文件概述(续)说明:在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件。ANSI C 标准只采用缓冲文件系统来处理文本文件和二进制文件。C语言中对文件的读写都是用库函数来实现。13.2 文件类型指针Turbo 在stdio.h文件中有以下的文件类型声明:typedef struct shortlevel; * *缓冲区缓冲区“满满”或或“空空”的程度的程度* * unsignedflags; * *文件状态标志文件状态标志* * char

19、fd; * *文件描述符文件描述符* * unsignedcharhold; * *如无缓冲区不读取字符如无缓冲区不读取字符* * shortbsize; * *缓冲区的大小缓冲区的大小* * unsignedchar*buffer;/*;/*数据缓冲区的位置数据缓冲区的位置* */ / unsignedar*curp;/*/*指针,当前的指向指针,当前的指向* */ / unsignedistemp;/*/*临时文件,指示器临时文件,指示器* */ / shorttoken;/*/*用于有效性检查用于有效性检查* */ /FILE; 在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FIL

20、E类型的区,存放文件的有关信息。13.2 文件类型指针(续)FILE类型的数组:FILEFILEf f5 5; ;定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。文件型指针变量:FILE *fpFILE *fp;fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。如果有个文件,一般应设个指针变量,使它们分别指向个文件,以实现对文件的访问。13.3 文件的打开与关闭一.文件的打开(fopen函数)函数调用:FILE *fp;fpfopen(文件名,使用文件方式);需要打开的文件名,也就是准备访问的文件

21、的名字;使用文件的方式(“读”还是“写”等);让哪一个指针变量指向被打开的文件。 13.3 文件的打开与关闭(续)文件使用方式含文件使用方式含 义义 “r r” ( (只读只读) )为为输入输入打开一个打开一个文本文本文件文件“w w” ( (只写只写) )为为输出输出打开一个打开一个文本文本文件文件“a a” ( (追加追加) )向向文本文本文件尾增加数据文件尾增加数据“rbrb” ( (只读只读) )为为输入输入打开一个打开一个二进制二进制文件文件“wbwb” ( (只写只写) )为为输出输出打开一个打开一个二进制二进制文件文件abab“ ( (追加追加) )向向二进制二进制文件尾增加数据

22、文件尾增加数据r+r+“ ( (读写读写) )为为读读/ /写写打开一个打开一个文本文本文件文件w+w+” ( (读写读写) )为为读读/ /写建立写建立一个新的一个新的文本文本文件文件a+a+” ( (读写读写) )为读为读/ /写打开一个文本文件写打开一个文本文件rb+rb+“ ( (读写读写) )为读为读/ /写打开一个写打开一个二进制二进制文件文件“wb+wb+“ ( (读写读写) )为读为读/ /写写建立建立一个新的一个新的二进制二进制文件文件“ab+ab+” ( (读写读写) )为读为读/ /写打开一个写打开一个二进制二进制文件文件13.3 文件的打开与关闭(续)二.文件的关闭(f

23、close函数)函数调用:fclose(文件指针);函数功能: 使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。返回值:关闭成功返回值为;否则返回EOF(-1) 。13.4 文件的读写一、字符输入输出函数(fputs()和fgets()fputs函数函数调用:fputs ( ch,fp ) ; 函数功能: 将字符(ch的值)输出到fp所指向的文件中去。 返回值:如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF。13.4 文件的读写(续)fgets函数函数调用:chfgets(fp);函数功能: 从指定的文

24、件读入一个字符,该文件必须是以读或读写方式打开的。 返回值:读取成功一个字符,赋给。如果遇到文件结束符,返回一个文件结束标志EOF 。13.4 文件的读写(续)常见的读取字符操作从一个文本文件顺序读入字符并在屏幕上显示出来: ch = fgetc(fp); while(ch!=EOF) putchar(ch); ch = fgetc(fp); 注意:EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现,因此EOF定义为是合适的。当读入的字符值等于时,表示读入的已不是正常的字符而是文件结束符。 13.4 文件的读写(续)常见的读取字符操作从一个二进制文件顺序读入字符: w

25、hile(!feof(fp) ch = fgetc(fp); 注意:ANSI C提供一个feof()函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为(真);否则为(假)。以上也适用于文本文件的读取。 13.4 文件的读写(续)fputc和fgetc函数使用举例:例例3 3从键盘输入一些字符,逐个把它们送到从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个磁盘上去,直到输入一个“”为止。为止。 #include #include void main(void) FILE *fp; char ch,filename10; scanf(%s,filename); if(f

26、p=fopen(filename,w)=NULL) printf(cannot open filen); exit(0); /*终止程序*/ ch=getchar( ); /*接收执行scanf语句时最后输入的回车符 */ ch=getchar( ); /* 接收输入的第一个字符 */ while(ch!=# fputc(ch,fp);putchar(ch); ch=getchar(); fclose(fp); 运行情况如下: (输入磁盘文件名) (输入一个字符串) (输出一个字符串) 13.4 文件的读写(续)fputc和fgetc函数使用举例:例例3 3将一个磁盘文件中的信息复制到另一个磁

27、将一个磁盘文件中的信息复制到另一个磁盘文件中盘文件中 。 #include #include main( )FILE *in,*out; char ch,infile10,outfile10; printf(Enter the infile name:n); scanf(%s,infile); printf(Enter the outfile name:n); scanf(%s,outfile); if(in=fopen(infile,r)=NULL) printf(cannot open infilen); exit(0); if(out=fopen(outfile,w)=NULL) pri

28、ntf(cannot open outfilen); exit(0); while(!feof(in)fputc(fgetc(in),out); fclose(in); fclose(out);运行情况如下: (输入原有磁盘文件名 n:(输入新复制的磁盘文件名)程序运行结果是将文件中的内容复制到中去。 13.4 文件的读写(续)fputc和fgetc函数使用举例:例例3 3的改进:复制一个二进制文件,利用的改进:复制一个二进制文件,利用mainmain参数,在输入命令行是将两个文件名输入。参数,在输入命令行是将两个文件名输入。 #include #include main(int argc,c

29、har *argv )FILE *in,*out; char ch; if (argc!=3) printf(You forgot to enter a filenamen);exit(0); if(in=fopen(argv1,rb)=NULL)printf(cannot open infilen); exit(0); if(out=fopen(argv2,wb)=NULL) printf(cannot open outfilen); exit(0); while(!feof(in) fputc(fgetc(in),out); fclose(in); fclose(out);运行方法:设经编

30、译连接后得到的可执行文件名为a.exe,则在DOS命令工作方式下,可以输入以下的命令行:a 和,分别输入到和中,的内容为a,的值等于 。13.4 文件的读写(续)二、数据块读写函数(fread()和fwrite()函数调用:fread (buffer,size,count,fp);fwrite(buffer,size,count,fp); 参数说明:buffer:是一个指针。对fread 来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。size: 要读写的字节数。count: 要进行读写多少个size字节的数据项。fp: 文件型指针。13.4 文件的读写(

31、续) 使用举例: 若文件以二进制形式打开: fread(f,4,2,fp); 此函数从fp所指向的文件中读入2个4个字节的数 据,存储到数组f中。13.4 文件的读写(续)使用举例:若有如下结构类型:struct student_typechar name10; int num; int age; char addr30;stud40;可以用fread和fwrite来进行数据的操作:for(;) fread(&studi,sizeof(struct student-type),1,fp); for(;,)fwrite(&studi,sizeof(struct student-type),1,f

32、p); 13.4 文件的读写(续)使用举例:例3从键盘输入个学生的有关数据,然后把它们转存到磁盘文件上去。 #include #define SIZE 4struct student_typechar name10; int num; int age; char addr15;studSIZE; /*定义结构*/13.4 文件的读写(续) void save( )FILE *fp; int i; if(fp=fopen(stu-list,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+)/*二进制写*/ if(fwrit

33、e(&studi,sizeof(struct student_type),1,fp)!=1) printf(“file write errorn”);/*出错处理*/ fclose(fp); /*关闭文件*/ main()int i; for(i=0;iSIZE;i+)/*从键盘读入学生信息*/scanf(%s%d%d%s,studi.name,&studi.num, &studi.age,studi.addr);save( );/*调用save()保存学生信息*/运行情况如下:输入个学生的姓名、学号、年龄和地址: Z- F - T - L - 验证在磁盘文件“-”中是否已存在此数据,用以下程

34、序从“-”文件中读入数据,然后在屏幕上输出。 13.4 文件的读写(续) #include #define SIZE 4 struct student_typechar name10; int num; int age; char addr15;studSIZE; main( )int i;FILE*fp;fp=fopen(stu-list,rb);for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student_type),1,fp); printf(%-10s %4d %4d %-15sn,studi.name, studi.num,studi. a

35、ge,studi.addr); fclose (fp);屏幕上显示出以下信息:Z -F -T -L - 如果已有的数据已经以二进制形式存储在一个磁盘文件“-”中,要求从其中读入数据并输出到“-”文件中,可以编写一个函数,从磁盘文件中读二进制数据。 13.4 文件的读写(续) void load( ) FILE *fp;int i; if(fp=fopen(stu-dat,rb)=NULL) printf(cannot open infilen); return; for(i=0;iSIZE;i+) if(fread(&studi,sizeof(struct student_type),1,fp

36、)!=1) if(feof(fp) fclose(fp); return; printf(file read errorn); fclose (fp); 13.4 文件的读写(续)三、格式化读写函数(fprintf()和fscanf()函数调用:fprintf ( 文件指针,格式字符串,输出表列);fscanf ( 文件指针,格式字符串,输入表列); 函数功能: 从磁盘文件中读入或输出字符。 例:fprintf(fp,”%d,%6.2f”,i,t);Fscanf (fp,”%d,%f”,&i,&t);注意:用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将

37、ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。13.4 文件的读写(续)三、其他读写函数putw()和getw()函数调用:putw(int i,FILE * fp);int i = getw(FILE * fp); 函数功能: 对磁盘文件中读写一个字(整数)。 例:putw(10,fp);i = getw(fp);putw函数定义如下:putw(int I,FILE *fp) char s; s=&I; putc(s0,fp); putc(s

38、1,fp); return i; gutwgutw函数定义如下:函数定义如下:gutw(FILE *fp) char s; s=char *&i; s0 = getc(fp); s1 = getc(fp); return i; 13.4 文件的读写(续)用户自定义读取其他类型数据的函数。向磁盘文件写一个实数(用二进制方式)的函数putfloat :putfloat(float num,FILE *fp)char s;int count;s = (char*)#for(count = 0;count 4;count+)putc(scount,fp); 13.4 文件的读写(续)fgets

39、函数函数作用:从指定文件读入一个字符串。函数调用:fgets(str,n,fp);从fp指向的文件输入n-1个字符,在最后加一个0。返回值:str的首地址。13.4 文件的读写(续)fputs函数函数作用:向指定的文件输出一个字符串。函数调用:fgets(“china”,fp);第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的不输出。 返回值:输入成功,返回值为0;输入失败,返回EOF。13.5 文件的定位rewind函数函数作用:使位置指针重新返回文件的开头,无返回值。应用举例应用举例:例例3 3有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。 #i

40、nclude main()FILE *fp1,*fp2; fp1=fopen(file1.c,r);fp2=fopen(file2.c,w); while(!feof(fp1) putchar(getc(fp1); rewind(fp1);while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); 13.5 文件的定位顺序读写和随机读写顺序读写:顺序读写:位置指针按字节位置顺序移动。随机读写随机读写:读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读些文件中任意位置上所需要的字符(字节)。 13.5 文件的

41、定位fseek函数(一般用于二进制文件)函数功能:函数功能:改变文件的位置指针。函数调用形式函数调用形式:fseek(文件类型指针,位移量,起始点)起始点:文件开头 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2位移量:以起始点为基点,向前移动的字节数。一般 要求为long型。 13.5 文件的定位fseek函数应用举例fseek(fpfseek(fp,100L100L,);,);将位置指针移到离文件头将位置指针移到离文件头100100个字节处。个字节处。fseek(fpfseek(fp,50L50L, ););将位置指针移到离当前位置将位置指针移到离

42、当前位置5050个字节处。个字节处。fseek(fpfseek(fp,50L50L, ););将位置指针从文件末尾处向后退个字节。将位置指针从文件末尾处向后退个字节。 13.5 文件的定位例例3 3在磁盘文件上存有个学生的数据。要求在磁盘文件上存有个学生的数据。要求将第、个学生数据输入计算机,并将第、个学生数据输入计算机,并在屏幕上显示出来。在屏幕上显示出来。 #include #include #include#include struct student_typestruct student_type char name10; char name10; int num; int num;

43、int age; int age; char sex; char sex; stud10; stud10; main()main() int i;int i; FILE *fp; FILE *fp; if(fp=fopen(stud-dat,rb)=NULL)if(fp=fopen(stud-dat,rb)=NULL) printf(can not open filen); printf(can not open filen); exit(0); exit(0); for(i=0;i10;i+=2) for(i=0;i10;i+=2) fseek(fp,i*sizeof(struct stud

44、ent_type),0);fseek(fp,i*sizeof(struct student_type),0); fread(&studi, sizeof(struct student_type),1,fp);fread(&studi, sizeof(struct student_type),1,fp);printf(printf(“%s %d %d %cn%s %d %d %cn”,studi.name,studi.name, studi.num,studi.age,studi.sex);studi.num,studi.age,studi.sex); fclose(fp) fclose(fp)

45、13.5 文件的定位ftell函数函数作用:得到流式文件中的当前位置,用相对于文件开头的位移量来表示。返回值:返回当前位置,出错时返回-1L。应用举例:i = ftell(fp);if(i=-1L) printf(“errorn”); 13.6 出错的检测ferror函数调用形式:ferror(fp);返回值:返回0,表示未出错;返回非0,表示出错。在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为。 13.6 出错的检测clearerr函数调用形式:clearerr(fp);函数作用:使文件错误标志和文件结束标志置为

46、0。只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。 13.7 文件输入输出小结分类分类 函数名函数名 功能功能 打开文件打开文件 fopen() 打开文件打开文件 关闭文件关闭文件 fclose() 关闭文件关闭文件文件定位文件定位 fseek() 改变文件位置指针的位置改变文件位置指针的位置 Rewind() 使文件位置指针重新至于文件开头使文件位置指针重新至于文件开头 Ftell() 返回文件位置指针的当前值返回文件位置指针的当前值文件状态文件状态 feof() 若到文件末尾,函数值为真若到文件末尾,函数值为真 Ferr

47、or() 若对文件操作出错,函数值为真若对文件操作出错,函数值为真 Clearerr() 使使ferror和和feof()函数值置零函数值置零13.7 文件输入输出小结分类分类 函数名函数名 功能功能 文件读写文件读写 fgetc(),getc()从指定文件取得一个字符从指定文件取得一个字符 fputc(),putc()把字符输出到指定文件把字符输出到指定文件 fgets()从指定文件读取字符串从指定文件读取字符串 fputs()把字符串输出到指定文件把字符串输出到指定文件 getw()从指定文件读取一个字(从指定文件读取一个字(int型)型) putw()把一个字输出到指定文件把一个字输出到

48、指定文件 fread()从指定文件中读取数据项从指定文件中读取数据项 fwrite()把数据项写到指定文件中把数据项写到指定文件中 fscanf()从指定文件按格式输入数据从指定文件按格式输入数据 fprintf()按指定格式将数据写到指定文件中按指定格式将数据写到指定文件中第十四章l 主要内容主要内容14.14. 常见错误分析常见错误分析14.14. 程序调试程序调试 14.1常见错误分析(1)忘记定义变量。(2)输入输出的数据的类型与所用格式说明符不一致。(3)未注意型数据的数值范围。 (4)在输入语句scanf中忘记使用变量的地址符。(5)输入数据的形式与要求不符。 (6)误把“”作为“

49、等于”运算符。 (7)语句后面漏分号。 (8)在不该加分号的地方加了分号。 (9)对应该有花括号的复合语句,忘记加花括号。 (10)括号不配对。 14.1常见错误分析(11) 在用标识符时,忘记了大小写字母的区别。(12) 引用数组元素时误用了圆括号。(13) 在定义数组时,将定义的“元素个数”误认为是“可使用的最大下标值”。(14) 对二维或多维数组的定义和引用的方法不对。(15) 误以为数组名代表数组中全部元素。(16) 混淆字符数组与字符指针的区别。(17) 在引用指针变量之前没有对它赋予确定的值。(18) switch语句的各分支中漏写break语句。(19) 混淆字符和字符串的表示形

50、式。 (20) 使用自加(+)和自减(-)运算符时出的错误。 14.1常见错误分析(21) 所调用的函数在调用语句之后才定义,而又在调用前未声明。 (22) 对函数声明与函数定义不匹配。 (23) 在需要加头文件时没有用#include命令去包含头文件。 (24) 误认为形参值的改变会影响实参的值。(25) 函数的实参和形参类型不一致。 (26) 不同类型的指针混用。 (27) 没有注意函数参数的求值顺序。 (28) 混淆数组名与指针变量的区别。 (29) 混淆结构体类型与结构体变量的区别,对一个结构体类型赋值。 14.1常见错误分析(21) 所调用的函数在调用语句之后才定义,而又在调用前未声

51、明。 (22) 对函数声明与函数定义不匹配。 (23) 在需要加头文件时没有用#include命令去包含头文件。 (24) 误认为形参值的改变会影响实参的值。(25) 函数的实参和形参类型不一致。 (26) 不同类型的指针混用。 (27) 没有注意函数参数的求值顺序。 (28) 混淆数组名与指针变量的区别。 (29) 混淆结构体类型与结构体变量的区别,对一个结构体类型赋值。(30) 使用文件时忘记打开,或打开方式与使用情况不匹配。 14.1常见错误分析程序出错有3种情况: 语法错误 逻辑错误 运行错误 14.2 程序调试 所谓程序调试是指对程序的查错和排错。调试程序步骤:(1)先进行人工检查,即静态检查。 (2)上机调试。 (3)在改正语法错误和“警告” 后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号