安顺上课教案课件_第1页
安顺上课教案课件_第2页
安顺上课教案课件_第3页
安顺上课教案课件_第4页
安顺上课教案课件_第5页
已阅读5页,还剩98页未读 继续免费阅读

下载本文档

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

文档简介

安顺上课教案聪明出于勤奋,天才在于积累安顺上课教案安顺上课教案聪明出于勤奋,天才在于积累第八章函数8.1概述模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块,特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之C是模块化程序设计语言C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用函数类型函数名(形参表)形参类型说明{ 说明部分 语句部分}传统风格:例有参函数(传统风格)intmax(x,y)

intx,y;{intz;z=x>y?x:y;return(z);}8.3函数的返回值返回语句形式:return(表达式);

或return表达式;

或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换void型函数例无返回值函数

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}例函数返回值类型转换main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}8.4函数的调用调用形式函数名(实参表);说明:实参与形参个数相等,类型一致,按顺序一一对应实参表求值顺序,因系统而定(TurboC自右向左)main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例参数求值顺序main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}运行结果:0运行结果:1调用方式函数语句:例printstar();printf(“Hello,World!\n”);函数表达式:例m=max(a,b)*2;函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));函数说明对被调用函数要求:必须是已存在的函数库函数:#include<*.h>用户自定义函数:函数类型说明函数说明一般形式:函数类型函数名(形参类型[形参名],…..);

或函数类型函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前有些系统(如BorlandC++)要求函数说明指出函数返值类型和形参类型,并且对void和int型函数也要进行函数说明例函数说明举例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函数可不作函数说明(BorlandC++不行)/*ch7_5.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被调函数出现在主调函数之前,不必函数说明/*ch7_5.c*/main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();8.5函数参数及其传递方式形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}例比较两个数并输出大者main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形参实参说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换———函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放8.5函数参数及其传递方式形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式例计算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728参数传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递711x:y:调用前:调用结束:711x:y:例交换两个数/*ch7_2.c*/#include<stdio.h>main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");

swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:temp地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量/*ch9_3.c*/swap(p1,p2)int*p1,*p2;{intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n",a,b);}例交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:8.6函数的嵌套与递归调用嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数main()调用函数a结束a函数b函数调用函数b#include<stdio.h>

longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);

return(c1+c2);}

longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;

return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含编译预处理命令函数类型说明函数定义函数调用函数调用函数返回值形参实参例求三个数中最大数和最小数的差值#include<stdio.h>

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数8.8变量的存储属性概述变量是对程序中数据的存储空间的抽象内存…….main(){inta;a=10;printf(“%d”,a);}编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储器类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-------静态变量与动态变量作用域:变量在某区域内有效-------局部变量与全局变量变量的存储类型auto-----自动型register-----寄存器型static------静态型extern-----外部型变量定义格式:[存储类型]数据类型变量表;6.8变量的存储属性概述变量是对程序中数据的存储空间的抽象如:intsum;

autointa,b,c;

registerinti;

staticfloatx,y;局部变量与全局变量局部变量---内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量局部变量可用存储类型:autoregisterstatic(默认为auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效全局变量---外部变量定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错定义

说明次数:只能1次可说明多次位置:所有函数之外函数内或函数外分配内存:分配内存,可初始化不分配内存,不可初始化外部变量说明:extern数据类型变量表;外部变量定义与外部变量说明不同若外部变量与局部变量同名,则外部变量被屏蔽外部变量可用存储类型:缺省或static/*ch7_17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例外部变量与局部变量运行结果:max=8动态变量与静态变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别第九章编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展开后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);9.1宏定义不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名---不作语法检查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏体可缺省,表示宏名定义过或取消宏体定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域格式:#undef宏名例#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域()()9.2文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译<>直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径被包含文件内容源文件(*.c)头文件(*.h)宏定义数据结构定义函数说明等文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c第十一章结构体与共用体§11.1概述结构体

(structure)—不同类型的数据组合成一个有机的整体定义结构体类型

一般形式:

struct结构体名{成员表列};

其中:struct为关键字,表示是一个“结构体类型”结构体名:同标识符规则一样。成员表列:组成结构体的各成员项。例:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};numnamesexagescoreaddr10010LiFunM1887.5Beijing

§11.2定义结构体类型变量的方法一.先定义结构体类型再定义变量名

structstudentstudent1,student2;表示:student1,student2为structstudent类型变量。

注意:定义结构体变量之前必须先定义结构体类型。二.在定义类型的同时定义变量例如:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;三.直接定义结构类型变量struct{成员表列}变量名表列;

例:struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;几点说明:

1.只能对结构体类型变量赋值,存取,运算等。而不能对结构体类型赋值,存取,运算等;

2.结构体中的成员如同普通变量一样,可以单独使用;

3.

结构体类型中的成员名可以与普通变量名相同。但二者是彼此独立的,互不干扰;4.结构体的成员可以又是一个结构体变量例如:structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];charsex;intage;

structdatebirthday;charaddr[30];}student1,student2;birthdaymonth

dayyear§11.3结构体类型变量的引用先定义后使用规则如下:1.引用方式:

结构体变量名.成员名

“.”:成员(分量)运算符,优先级为1

例:student1.num,student1.addr注意:

(1)不能将一个结构体变量作为一个整体进行输入,输出等。而只能对结构体变量成员分别进行输入,输出,赋值等.

printf(“%d,%s,%c,%d,%f,%s\n”,student1);不合法

printf(“%s\n”,);

合法

student1.num=10010;合法

(2)新标准C中,可以将一个结构体变量直接赋给另一个具有相同结构的结构体变量.如:

student1=student2;2.如成员本身又属一个结构体类型。则只能对最低级成员进行赋值,存取和运算等。例:

student1.birthday.month不能用student1.birthday来访问student1中的成员birthday。3.对结构体变量中的成员可以象普通变量一样进行各种运算。例:student2.score=student1.score;student1.age++;4.允许使用成员和结构体变量的地址。例:scanf(“%d”,&student1.num);

§11.6指向结构体类型数据的指针一.指向结构体变量的指针

结构体变量的指针就是结构体变量所占内存段的起始地址。存放该地址的变量叫做指向结构体变量的指针变量,简称指向结构体变量的指针。例11.3

main(){structstudent{longintnum;charname[20];charsex;floatscore;};structstudentstu1;structstudent*p;

p=&stu1;stu1.num=89101;strcpy(,“LiLin”);stu1.sex=‘M’;stu1.score=89.5;printf(“No.:%ld\nname:%s\nsex:%c\nscore:%f\n”,stu1.num,,stu1.sex,stu1.score);printf(“\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n”,

(*p).num,(*p).name,(*p).sex,(*p).score);}89101“LiLin”‘M’89.5

p

stu_1运行结果:No.:89101name:LiLinsex:Mscore:89.500000说明:

1.程序中*p表示p指向的结构体变量。(*p).num表示p指向的结构体变量中的成员num。

2.

(*p).num等效于p–>num。–>表示指向结构体成员运算符。

3.结构体变量中成员的引用有三种形式:(1)结构体变量.成员名;(2)(*p).成员名;(3)p–>成员名;注意:

p–>n

表示p指向的结构体变量中的成员n的值。

p–>n++

表示p指向的结构体变量中的成员n的值。用完该值后使其加1。

++p–>n

表示使p指向的结构体变量中的成员n的值加1。(先加)二.指向结构体数组的指针例11.4

structstudent{intnum;charname[20];charsex;intage;};structstudentstu[3]={{10101,“LiLin”,‘M’,18},{10102,“ZhangFun”,‘M’,19},{10104,“WangMin”,‘F’,20}};main(){structstudent*p;printf(“NoNamesexage\n”);for(p=stu;p<stu+3;p++)

printf(“%d%s%c%d\n”,p–>num,p–>name,p–>sex,p–>age);}运行结果:NoNamesexage10101LiLinM1810102ZhangFunM1910104WangMinF20stu[0]stu[1]stu[2]4项4项4项pp+1p+2

注意:

指向结构体数组的指针p加1的含义。例:

(++p)–>num和(p++)–>num例11.5#defineFORMAT“%d\n%s\n%f\n%f\n%f\n”structstudent{intnum;charname[20];floatscore[3];};main(){voidprint();

structstudentstu;stu.num=12345;strcpy(,“LiLi”);stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.6;

print(&stu);

}voidprint(p)

structstudent*p;{printf(FORMAT,p–>num,p–>name,p–>score[0],p–>score[1],p–>score[2]);printf(“\n”);}说明:1.程序中各成员的赋值可用scanf函数。

scanf(“%d%s%f%f%f”,&stu.num,,&stu.score[0],&stu.score[1],&stu.score[2]);§11.7链表采用链式存储结构的链表是用一组任意的存储单元来存放线性表的数据元素,这组存储单元既可以是连续的,也可以是不连续的,甚至可以是零散分布在内存中的任何位置上。1、单向链表单向链表是链式存储结构中最简单和最基本的结构.在链表中数据元素的逻辑次序与物理存储次序不一定相同,为了能正确表示数据元素间的逻辑关系,在存储每个元素值的同时,还必须存储其直接后继(或直接前趋)的存储位置,这一部分称为链。因此,单向链表的每个数据元素由两部分组成:存储元素的数据域(DATE)和存储直接后继元素存储地址的指针域(NEXT)。其结构如下:datanext一个线形表a1,a2,….,an

对应的单链表可用下图表示。h链表的头指针:用以确定线形表中第一个元素对应的存储位置,单链表可以用头指针的名字来命名。链表的终点元素无直接后继,故其指针域为空NIL,在图中用^表示。a1ha2…a3an^带头结点的单链表为空时。其逻辑示意如下图所示.显然,带头结点的单链表把空表和非空表的处理统一起来了,对单链表初始化,就是建立一个空的单链表.^h为了算法实现上的方便,通常在单链表的第一元素之前附加一个称为头结点的元素。头结点的数据域可以不存任何数据,也可以存放象线形表的表长的数据信息。如图所示,单链表的头指针指向头的结点。h…a1a2an^(1)链表的访问【算法3】访问单链表的算法elemtypeaccess(node*h,inti){ node*p; intj; p=h;j=0; WHILE(p->next!=NULL&&j<i) { p=p->next; j++; } if(p!=NULL&&j=i) return(p->data); else return(NIL);}(2)单链表的插入运算设有线性表a1,a2,…,an,用带头结点的单链表存储,现要求在数据元素ai的结点之前插入一个数据元素为x的结点。首先应找到数据元素ai-1结点

,以便打开ai-1与ai的两数据元素之间的链:然后申请一个新的结点空间,放上数据值x。最后,重新建立ai-1与x

、x与ai两两数据元素之间的链,构成新的链表。算法示意图如图所示:

hai-1…an^…aix【算法3】单链表的插入算法voidinsertsl(node*h,inti){ node*p,*t; intj; p=h;j=0; while(p!=NULL&&j<i-1) { p=p->next; j++; } if(j!=i-1) { printf(“iisinvalid”); return; } t=(node*)malloc(sizeof(node)); t->data=x; t->next=p->next; p->next=t;}ai-1aix(3)单链表的删除运算删除操作和插入操作一样,首先要搜索单链表以找到指定删除结点的前趋结点(假设为P),然后将待删除结点的指针域内容赋予P结点的指针域,最后释放删除结点所占的存储空间。hai-1…an^…ai+1aihai-1…an^…ai+1aipps【算法5】单链表的删除算法voiddeletesl(node*h,inti){node*p,*s;intj;p=h;j=0;while(p->next!=NULL&&j<i-1){p=p->next;j++;}if(j!=i-1){printf(“iisinvalid”);return;}s=p->next;p->next=s->next;free(s);}(4)单链表的建立为建立链表,首先要为每个数据元素动态申请一个结点空间,然后通过指针将这些结点依次相连。链表是一种动态存储结构,每个结点所需的存储空间是在程序执行时动态申请的。利用前面已介绍过的链表插入新的结点的算法,不难得到创新链表的算法:首先建立一个空链表,然后不断向链表中插入新的数据元素,形成各结点。根据插入新结点的位置不同,可以形成两种创建新链表的方法:一是每插入的新结点作为链表的第一结点,此时,建立链表是从表的最后一个元素开始,从后向前依次插入结点的:二是每插入的结点是当前链表的做末结点,此时,建立链表是从表的第一个元素开始,从前向后依次插入结点的。

§11.8共用体一.共用体的概念

“共用体”类型结构:几个不同的变量共占同一段内存的结构

“共用体”类型变量的定义

union共用体名{成员表列}变量表列;例如:uniondata{inti;charch;floatf;}a,b,c;整型变量i实型变量f起始地址字符型变量ch

也可:uniondata{inti;charch;floatf;};uniondataa,b,c;union{inti;charch;floatf;}a,b,c;结构体变量所占内存的长度是各成员占的内存长度之和,且每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。二.共用体变量的引用方式

规则:先定义,后使用,且只能引用共用体变量中的成员。如:a.i,a.ch,a.f等等.而:printf(“%d”,a);(不合法)三.共用体类型数据的特点

1.并非所有成员都同时存在和起作用.即:每一瞬时只有

一个成员起作用。

2.共用体变量中起作用的成员是最后一次存放的成员。例如:uniondata{inti;charch;floatf;}a;……a.i=1;a.ch=‘a’;a.f=1.5;

则只有a.f有效,而此时a.i和a.ch已无意义。

但若存在相同数据类型的成员,则该成员就有意义.如:main(){uniondata{inti;charch;floatf;floatx;}a;

a.i=1;a.ch=‘a’;a.f=1.5;printf(“%f,%f\n”,a.f,a.x);}输出为:1.5,1.5

a.cha.ia.fa.x3.共用体变量的地址和它的各成员的地址都是同一地址.4.

不能对共用体变量名赋值,也不能在定义是对其初始化。

uniondata{inti;charch;floatf;}a={1,‘a’,1.5};

(不合法)5.共用体变量不能作函数参数,但指向共用体变量的指针则可以。uniondata{

structst{inta;intb;}x;inty;intz;}max;structst{uniondata{inta;charb;}x;inty;floatz;}min;6.

结构体类型和共用体类型可以相互嵌套。如:补充例题:以下程序的输出为:

#include“stdio.h”main(){uniondata{structst{intx;inty;}m;inta;intb;}e;e.a=1;e.b=2;e.m.x=e.a*e.b;e.m.y=e.a+e.b;printf(“\n%d,%d”,e.m.x,e.m.y);printf(“\n%d,%d”,e.a,e.b);}

e.m.xe.m.y起始地址4,84,4e.ae.b第10章文件操作目录文件概述文件类型指针文件的打开和关闭文件的读写文件的定位文件(File)C语言中的文件C语言把文件看作一个字节的序列C语言对文件的存取是以字节为单位的文本文件(ASCII文件)按数据的ASCII形式存储二进制文件按数据在内存中的二进制形式存储文本文件和二进制文件缓冲文件系统文件类型指针FILE类型保存被使用的文件的有关信息所有的文件操作都需要FILE类型的指针FILE是库文件中定义的结构体的别名注意不要写成structFILE举例FILE*fp;FILE类型typedefstruct{shortlevel;/*缓冲区满空程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*无缓冲则不读取字符*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据缓冲区*/unsignedchar*curp;/*当前位置指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/}FILE;文件的打开(fopen函数)函数原型FILE*fopen(char*filename, char*mode);参数说明filename:要打开的文件路径mode:打开模式返回值若成功,返回指向被打开文件的指针若出错,返回空指针NULL(0)文件的打开模式打开模式描述r只读,打开已有文件,不能写w只写,创建或打开,覆盖已有文件a追加,创建或打开,在已有文件末尾追加r+读写,打开已有文件w+读写,创建或打开,覆盖已有文件a+读写,创建或打开,在已有文件末尾追加t按文本方式打开(缺省)b按二进制方式打开文件的打开举例FILE*fp1,*fp2,*fp3;charfilename[]="file3.dat";/*以文本只读方式打开file1

*/if(!(fp1=fopen("file1","r"))){printf("CannotOpenThisFile!\n");exit(0);/*退出程序*/}/*以二进制读写方式打开FILE2.TXT

*/fp2=fopen("C:\\HOME\\FILE2.TXT","rb+");/*以二进制读写方式打开file3.dat

*/fp3=fopen(filename,"a+b");文件的关闭(fclose函数)函数原型intfclose(FILE*fp);参数说明fp:要关闭的文件指针返回值若成功,返回0若出错,返回EOF(-1)不用的文件应关闭,防止数据破坏丢失文件的关闭举例FILE*fp;charfile[]="D:\\USER\\STUDENTS.DAT";if(!(fp=fopen(file,"rb+"))){printf("Openfile%serror!\n",file);exit(0);}......fclose(fp);文件的读写函数功能函数功能fputc输出字符fprintf格式化输出fgetc输入字符fscanf格式化输入putc输出字符putw输出一个字getc输入字符getw输入一个字fwrite输出数据块fputs输出字符串fread输入数据块fgets输入字符串feof函数函数原型intfeof(FILE*fp);参数fp:文件指针返回值若文件结束,返回非零值若文件尚未结束,返回0fputc/putc函数函数原型intfputc(intc,FILE*fp);intpu

温馨提示

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

评论

0/150

提交评论