C语言的先祖是BCPL语言。它是由美国贝尔实验室的D.M.Ritchie在1972-1973年间设计出来的计算机编程语言。C语言还是目前使用最为广泛的计算机编程语言之一,由于它学习起来简单、使用方便、功能强大和容易上手等特点,普遍被广大程序设计者使用。
算法需要有以下特性:(1)有穷性:有限的操作步骤;(2)确定性:每个步骤都是确定的,不能含糊;(3)有零个或多个输入:从外界获取必要输入信息;(4)有一个或多个输出:一个没输出的算法没有意义;(5)有效性:每个步骤都能有效执行;
常量包括以下几种:整形常量、实型常量、字符常量、字符串常量和符号常量。整形常量如100等;实型常量有两种形式,一种是十进制小数形式如10.21,另一种是指数形式如12.34e3(代表12.34×10*3);字符常量包括普通字符如‘a’,和转义字符‘\n’。字符串常量是使用双撇号把若干个字符括起来,如“boy123”。符号常量是指使用#define指令,指定一个符号代表一个常量,如#define P1 3.12,这时P1代表3.12。
变量代表一个有名字的、具有特定属性的一个存储单元,存储单元里的值是可以改变的,所以变量的值可以改变。在使用变量时必须先定义,后使用。在有些情况下我们不希望变量的值被改变,这时可以将变量定义为常变量。使用const可以将变量定为常变量,如const int P1=12,之后P1的值将不会被改变。
在定义变量和函数时,需要指定相应的数据类型,数据类型包括:整型类型、浮点类型、枚举类型(enum)、空类型(void)和派生类型。
整型类型:注意整型中,区分有无符号的整型,无符号需要加上unsigned,如unsigned int a;
经常混肴的运算符有:/(除法运算符)、%(求余运算符)、++和--(自增和自减运算符),例如++i(--i),它们在使用i之前,先使i的值加(减)1;i++(i--),它们在使用i之后,使i的值加(减)1。
强制类型转换符:使用强制类型转换符可以使一个表达式转换成所需的类型,一般形式如:(类型名)(表达式),例如(double)a,(float)(5%3)将5%3的值转换为float类型。
需要注意的运算符:= 赋值运算符、== 等于运算符、?:条件运算符、(sizeof)求字节数运算符、,-成员运算符、左移运算符、复合的赋值运算符,例如j×=y+8,等价于j=j×(y+8)等。
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
注意:当一个占多字节的整型数据,给一个占少字节的整型变量或字符变量赋值时,只能将它的低字节原封不动的送到被赋值变量,例如:a占4个字节,b占2个字节,当b=a时,只能把a的2位低字节赋给b。
通过标准的输入函数完成,系统函数库中标准的输入函数有:scanf(格式输入)、gets(输入字符串)、getchar(输入字符)。
scanf函数的一般形式:scanf(格式控制,地址列表),如scanf(“a=%f,b=%f”,&a,&b);
gets函数的一般形式:gets(地址),如int a[10],gets(a),从键盘输入字符串,送到数组a中。
getchar函数的一般形式:a=getchar(),从键盘输入一个字符,送到字符变量a。
标准输出函数有:printf(格式输出)、puts(输出字符串)、putchar(输出字符)
printf函数的一般格式:printf(格式控制,输出列表),如printf(“a=%d,ch[]=%s”,a,ch);a是变量名,ch是数组ch[]的数组名。
puts函数的一般格式:puts(地址),如int a[10],puts(a),这地址是指要输出数组的地址。
if语句的一般形式是:if(表达式)语句1,如if(a+b10) printf(yes);表达的意思是,如果a+b的值大于10,则执行printf函数输出yes。通过判断if表达式的真假,来判断是否执行语句1。
优先级:!(非)算术运算符关系运算符&&(与)(或)赋值运算符
注意:switch后面括号内的“表达式”,其值的类型应为整数类型(字符型)
在执行switch语句时,根据switch表达式的值找到相应的入口标号,然后从相应的case中执行语句,在执行完入口标号的case语句后,程序会继续往下执行下面的case标号的语句,直到switch程序结束,所以一般情况下需要在case子句后面,应用break语句,使程序跳出switch结构。如果没有与switch表达式相匹配的case常量,流程会转去执行default标号后面的语句。
for循环的一般形式: for(表达式1;表达式2;表达式3) 语句,例如
其中表达式1可以省略,如for(;i10;i++),但分号不能省。但是当表达式2省略时,表示无限循环。
while实现循环有两种方式,一种是使用do.....while结构,另一种是使用while结构。
注意:break语句和continue语句的区别是,在执行for或while循环语句时,通过break语句可以提前终止循环,跳出循环体。而continue语句只是提前结束本次循环,而不是终止整个循环,然后继续执行下一次循环。
数组是一组有序数据的集合,数组中的每个元素都是同一种类型。通过数组可以存储一组数据或多组数据。定义一维数组的一般形式为:类型符 数组名 [常量表达式];例如int a[10],定义了一个名为a的数组,它包含10个元素,它第一个元素是a[0]。当数组常量表达式为空时,数组的长度由初始化列表中元素的个数决定,例如int a[ ]={1,2},这时a数组的长度为2。
数组的常量表达式可以是常量和符号常量(#define P1 3.12,其中P1代表符号常量),但不能是变量。如果数组是在被调用的函数里面(不包括主函数)定义的数组,其长度可以是变量或非常量表达式。例如:
这种情况称为“可变长数组”,允许每次调用fun函数时,n有不同的值,但在执行fun函数时,n的值是不变的。如果指定fun函数中的a数组为静态(static)存储方式,则不能用“可变长数组”,例如:static int a[2*n];这是不合法的,即可变长数组不能定义为静态存储方式。
一维数组的数组名代表数组的起始地址。一维数组的初始化可以用“初始化列表”或给数组元素逐个赋值,其中“初始化列表”的方式,如:int a[10]={0,1,2,3,4};,把初始化列表的数值,逐个赋给a数组的前5个元素,系统会自动给后面5个元素赋初值为0。给数组元素赋值,如a[0]=1;
数组中的元素引用,可以通过数组名加下标的方式,一般形式为:数组名[下标],下标可以是整型常量、整型的符号常量、整型表达式或者是整型变量,如int i=1; b=a[i]。
二维数组定义的一般形式:类型符 数组名[常量表达式1][常量表达式2];
例如:float a[3][4],定义一个3×4(3行4列)的数组a,常量表达式1表示数组的行数,常量表达式2表示数组的列数。
二维数组可以看成一个特殊的一维数组,它的元素又是一个一维数组,例如,把a看为一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组,如a[0]包含:a[0][0],a[0][1],a[0][2],a[0][3]。a[0]、a[1]、a[2]可以看作三个一维数组名。二维数组元素的存放是按行存放的,先放第一行,再放第二行。在内存中二维数组的各元素是连续存放的,不是二维的,是线性的。
int a[3][4]={{1,2},[5],{9}}; 表示给第一行的1、2列分别赋值1和2,给第二、三行的第1列,分别赋值5和9,其余元素值自动为0;
2、把所有数据写在一个花括号中,按数组元素在内存中的排列顺序对各元素赋初值。
4、如果给数组全部元素赋初值(即提供全部初始化数据),定义二维数组时,第1维(行)的长度可以不指定,但第2维(列)的长度不能省略。
二维数组元素的引用:二维数组元素表示形式,数组名[下标1][下标2],下标应是整型表达式,如 a[0][1]=1;b=a[0][1]; 把数组a的第0行,第1列的元素赋值给b,b=1。
字符数组的一般形式与一维数组和二维数组的一样的,只是数据类型不同,例如,char a[2]={I,k};char a[ ]={I,k};,这两个数组的长度都是一样的。char a[2][2]={{b,a},{c,d}}; char a[][2]={{b,a},{d}};,当字符数组初值的个数小于数组长度时,只将这些字符赋给数组中前面的元素,其余的元素自动定为空字符(即‘\0’)。
在C系统中,使用字符数组存储字符串常量时会自动加一个\0作为结束符,C语言规定了\0作为字符串结束标志,\0代表ASCII码为0的字符。例如char c[ ]={C program},字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节\0是由系统自动加上的。
1、gets(字符数组) 输入字符串函数gets(c); //c是数组名,代表数组c的地址
2、puts(字符数组) 输出字符串函数puts(c); //c是数组名,代表数组c的地址
3、strcat函数——字符串链接函数strcat(字符数组1,字符数组2)
char str1[30]={ABC}; char str2[]={DE}; printf(%s,strcat(str1,str2)); 输出:ABCDE (1)字符数组1必须足够大,以便容纳连接后的新字符串。如果字符数组1不够大,会出现问题。 (2)连接前两个字符串的后面都有\0,连接时将字符串1后面的\0取消,只在新字符串最后保留\0。 (3)连接的新串放在字符数组1中,函数最后返回的是字符数组1的地址。
(2)、字符数组1必须写成数组形式,字符串2可以是字符数组名,也可以是字符串常量。
(3)、如果字符数组1没被赋初值,它各字节中的内容是未知的,复制时将str2中的字符串和其后的‘\0’一起复制到字符数组1中,取代其前6个字符,str1的最后4个字符并不一定为\0,而是其原有的最后4个字节的内容。
(5)、可以使用strncpy函数将字符串2中的前n个字符复制到字符数组1中,但n不应多于str1中原有的字符(不包括\0)。
5、strcmp函数——字符串比较函数strcmp(字符串1,字符串2)
(1)比较规则,两个字符串自左至右逐个字符相比较(按ASCII码值大小比较),直至出现不同字符或遇到\0为止。
(4)字符串1=字符串2,则函数值为0;字符串1字符串2,则函数值为一个正整数;字符串1字符串2,则函数值为一个负整数。
在编写一个程序时,往往不是只实现一个或两个功能,当程序功能多且复杂时,如果还是把功能的实现放在主函数里,会使得主程序变得复杂,使思路变得复杂,不利于查看和检查,而且有时一个程序需要多人一起完成,如果把系统功能实现放在主程序中,这样会不利于团队的合作。通过函数可以把程序的各功能分别在子函数中实现,然后通过主函数调用各子函数就可以实现系统的功能,在团队合作中,每个人只需把他需要完成的功能写在子函数中,最后通过主函数调用就能实现系统功能。使用函数可以大大简化程序功能的实现,有助理清思路,各功能可以互不干预。
函数体包括声明部分和语句部分。定义函数时的类型名是指定函数返回值的类型。
如果函数在主函数后定义,在函数调用前,需要对函数进行声明,声明方式是:类型名 函数名();例如:int max(int x,int y);,根据函数在程序中的位置和形式,函数调用分三种形式:
函数调用时,用到的实参和形参是直传递的,即形参的改变不会影响到实参。当形参类型是指针、数组、或变量的&引用时,形参的改变才会影响到实参。
函数的嵌套调用是指,在主函数中调用a函数(子函数),然后在a函数中调用b函数(别的子函数),函数的执行流程是:在主程序中遇到a函数调用,则跳到a函数执行,在a函数遇到b函数调用,下一步跳到b函数执行,在b函数执行完后,程序返回a函数继续执行,a函数执行完后,程序返回主函数继续执行,直到整个主函数执行完毕。
在调用一个函数的过程中又出现直接或间接地调用本函数本身,称为函数的递归调用。
函数的实参可以是常量、变量或表达式,数组元素当实参与变量相当,向形参传递数组元素的值,从实参传到形参,单向传递(值传递)。此外,数组名也可以当实参和形参,传递的是数组第一个元素的地址(首地址),即实参和形参数组的地址相同,它们操作同一片存储空间,所以当形参改变时,实参也会跟着改变。
局部变量包括:在函数内部定义的变量(包括主函数)、在复合语句内定义的变量、形参也是局部变量。它的作用域是定义函数内部、定义复合语句内部,例如在fun函数内定义的变量,它的作用域是fun函数。在for循环里定义的变量,它的作用域是for循环里面。
在函数之外定义的变量称为外部变量,外部变量是全局变量,它的作用域是从定义变量的位置开始到本源文件结束,全局变量可以为本文件中其他函数所共用。
当定义的全局变量和局部变量同名时,在局部变量的作用域内,同名的全局变量会被同名的局部变量所屏蔽。例如在全局变量a=10,局部变量a=5,在局部变量a的作用域内,b=a,则b的值为5。
供用户使用的存储空间分3部分:(1)程序区;(2)静态存储区;(3)动态存储区。数据分别存储在静态存储区和动态存储区中,全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
(2)函数中定义的没有用关键字static声明的变量,即自动变量(auto变量)。
以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的。
在c语言中,每个变量和函数都有两个属性:数据类型和数据的存储类别。在定义和声明变量和函数时,一般应同时指定其数据类型和存储类别,也可以采用默认方式指定(系统自动指定为某一种存储类别)。数据类别指的是:数据在内存中的存储方式(静态存储和动态存储)。
C的存储类别包括4种,自动的(auto),静态的(statis)、寄存器的(register)、外部的(extern)。
函数中的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存放在动态存储区中。函数中的形参和函数中定义的局部变量(包括复合语句中定义的局部变量)都是自动变量(auto变量)。
静态局部变量属于静态存储类别,存放在静态存储区内分配的单元。对静态局部变量赋初值是在编译时完成的(即只赋初值一次),在以后函数调用时,不再重新赋初值,而是保留上一次调用函数结束时的值。例如
第一次调用a函数时,i的初值为1,输出i为1;第二次调用a函数输出的i为2,保留上一次函数结束时的值。
当定义的静态局部变量不赋初值时,编译时自动赋初值为0(对数值型变量)或\0(对字符变量)
寄存器变量存放在CPU中的寄存器中,它不是存放在内存中的。由于寄存器变量存放在cpu中的寄存器中,所以数据的存取速度远高于存放在内存中的数据的存取。使用寄存器变量可以提高执行效率。定义寄存器变量的一般形式:register int f;
全局变量都是存放在静态存储区中的。它的作用域一般是从定义全局变量处开始,到本程序文件的末尾。当定义外部变量的位置,不是位于文件开头时,在外部变量定义处之前的程序是不能引用外部变量的,如果要引用外部变量,需要在引用之前使用关键字extern对该变量进行“外部变量声明”
把外部变量的作用域扩展到其他文件的方式,可以在其他文件中使用extern对外部变量进行声明。例如
把外部变量的作用域限定在本文件中,只能被本文件引用,而不能被其他文件引用,可以通过,在定义外部变量时加一个statis声明来实现。通过statis定义的静态外部变量只能作用于本文件,当其他文件也定义了相同名字的外部变量时,它们之间的互不干预的。例如
如果一个函数只能被本文件中其他函数所调用,它称为内部函数(又称静态函数,因为它使用static声明的),它的作用域只局限于所在文件。这样,在不同文件中即使有同名的内部函数,也互不干扰。一般形式:static 类型名 函数名(形参列表),例如static int a(int a){...}
如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数,可供其他文件调用。函数首部可以为:extern int fun(int a,int b)。C语言规定,如果在定义函数时省略extern,则默认为外部函数。
指针指的是地址,一个变量的地址称为该变量的指针。一个变量专门用来存放另一个变量的地址,称为指针变量。指针变量的值是地址。
存放地址的变量是指针变量,它用来指向另一个对象(如变量、数组、函数等)。定义指针变量的一般形式:类型名 *指针变量名;如int *a;char *b;定义了指向整型变量的指针变量a和定义了指向字符变量的指针变量b;
一个变量的指针的含义包括两方面:一是以存储单元编号表示的地址,一是它指向的存储单元的数据类型。
当指针变量指向一个变量时,那么指针变量就存储着所指向变量的地址,通过对指针变量的使用可以实现它所指向变量的功能。例如
当指针变量作为形参时,因为形参和实参所操作的存储单元是同一个的(它们指向同一个存储单元),所以形参值的修改也会导致实参值的修改。
所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素,例如:
在引用数组元素时指针的运算。因为指针的值是数组元素的地址,当指针p指向数组中的一个元素时,则p+1指向同一数组中下一个元素,p-1指向同一数组中的上一个元素。注意:执行p+1时,并不是将p的值(地址)简单的加1,而是加上一个数组元素所占用的字节数。例如,数组元素是float型,每个元素占4个字节,则p+1意味着是p的值(地址)加4个字节。
指针法:如 *(a+i)或*(p+i),其中a是数组名,p是指向数组元素的指针变量,其初值p=a。
注意:*p++,由于++和*同优先级,结合方向为自右向左,因此它等价于*(p++),先引用p的值,实现*p的运算,然后再使p自增1(p+1).
通过指针引用多维数组,以int a[3][4]为例,a代表首行的首地址,a+1代表序号为1的行的首地址,a+1指向a[1](代表a数组的元素,但它又是一维数组),或者说a+1的值是a[1]的首地址。a[0],a[1],a[2]代表一维数组名,因此a[0]代表一维数组a[0]的第0列的地址(即&a[0][0])。
二维数组名(如a)指向行的。在指向行的指针前加一个*,就转换为指向列的指针,例如a+1(行指针),第一行的指针;*(a+1)为列指针,第一行第0列的指针。反之在列的指针前加&,就成为指向行的指针,例如&a[0],由于a[0]和*(a+0)等价,因此&a[0]和&*a等价,它是指向第0行的指针。
字符指针作函数参数,例如: void fun(char *p),调用时,实参可以是字符指针变量、字符数组名。
void fun(char a[ ]),调用时,实参可以是字符指针变量、字符数组名。
用字符指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串,例如:
函数代码也有存储空间,这段存储空间的起始地址称为这个函数的指针。定义一个指针变量指向函数,存放某一函数的起始地址,因为此指针变量指向该函数。这就是指向函数的指针(函数指针变量)。函数指针变量定义方式:类型名 (*指针变量名)(函数参数列表);例如:int (*p)(int ,int);,定义一个指向函数的指针变量p,它可以指向函数的类型为整型且有两个整型参数的函数。
指向指针数据的指针变量的定义为 :类型名 **指针名,如char **p,p=name,其中name是指针数组的数组名,*p代表指针数组中存储的指针,**p代表指针数组中存储的指针所指的单元的值。
指针数组作main函数的形参:int main(int argc,char *argv[ ]),其中argc,argv,它们是程序的命令行参数(这是在系统操作命令下完成),argc是参数的个数。命令行的一般形式:命令名 参数1 参数2 ....参数n,其中命令名是可执行文件名,如,可执行文件flie1.exe,现想将两个字符串“china”,“beijing”作为传送给mian函数的参数,命令行可写为 flie1 china beijing,这时argc的值为3,参数的个数为3,argv[0]指向flie1字符串。
内存中的动态存储区也称之为栈区。在C语言中还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,可以随时开辟和关闭,这些数据是临时存放在一个特别的自由存储区,称之为“堆(heap)区”
对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这4个函数,在使用这些函数时,需要添加头文件stdlib.h。
malloc函数,其函数原型为:void *malloc(unsigned int size),其作用是在内存的动态存储区中分配一个长度为size的连续空间,形参size是无符号整型,不允许有负数,该函数的返回值是所分配的第一个字节的地址。注意,指针的基类型为void,即不指向任何类型的数据,只提供地址。如果该函数未能成功执行(例如内存空间不足),则返回空指针(NULL)。
calloc函数,其函数原型为:void *calloc(unsigned n,unsigned size),其作用是在内存的动态存储区中分配n个长度为size的连续空间,这空间一般比较大,足可以保存一个数组。可以使用calloc为一维数组开辟动态存储空间,n代表数组元素个数,每个元素的长度为size。这是动态数组,该函数返回的是所分配域的起始位置的指针,如果分配不成功,则返回NULL。
free函数(无返回值),其函数原型为:void free(void *p),其作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc和malloc函数时得到的函数返回值。例如free(p)。
void 指针类型,定义一个void类型的指针变量,它不指向任何类型的数据,它是空类型或不指向确定类型,例如void *p; p=&a, printf(%d,*p),错误,因为p是无指向,不能指向a。
结构体类型,是由用户根据自己的需要建立的数据类型。声明一个结构体类型的一般形式:struct 结构体名 {成员列表};例如:
花括号内是该结构体的成员,成员列表也称为“域表”,每个成员是结构体中的一个域。成员名命名规则与变量名相同。它的成员可以是另一个结构体类型。
在建立结构体类型时,它只相当于一个模型,并没有定义变量,其中并无具体数据,系统不会对其分配存储单元。定义结构体类型变量的三种方式:
引用结构体变量的成员:结构体变量名.成员名 例如studen1.num=10101;
如果成员本身又是结构体类型,则要使用若干个成员运算符,一级一级地找到最低的一级的成员。例如,student1.birthday.month(结构体变量student1中的成员birthday中的成员month)
定义结构体数组和定义一般数组的方式类似,它的一般形式为:结构体类型 数组名[数组长度],或struct 结构体名 { 成员列表 } 数组名[数组长度];,它的每个成员都是结构体类型。
指向结构体变量的指针,称为结构体指针,一个结构体变量的起始地址就是该结构体变量的指针。指向结构体变量的指针变量既可指向结构体变量,也可指向结构体数组中的元素。
(++p)-num //先使p自加1,然后得到p指向的数组元素中的num成员的值。
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量的地址传给形参。
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。链表可以根据需要开辟内存单元。链表有一个“头指针”变量head,它存放一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包含两个部分:(1)用户需要用的实际数据;(2)下一个结点的地址。

链表中各元素在内存中的地址可以不连续,要找某一元素,可以通过它的上一个元素中的地址寻找。如果不提供头指针(head),则整个链表都无法访问。通过结构体变量建立链表最合适。例如:
所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。
动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。
共用体结构,用同一段内存单元存放不同类型的变量(存放共用体的成员,但同时只能放一个,保留最一个存放的变量)。
共用体类型数据的特点,同一段内存可以几种不同的类型成员,但每一瞬间只能存放其中一个成员,而不是同时存放几个成员。
命名一个新的类型名代表数组类型,例如typedef int Num[100];//声明Num为整型数组类型名
String p,s[10];//定义p为字符指针变量,s为字符指针数组。一般typedef声明新的类型名的开头用大写。
文件有不同的类型,在程序设计中,主要用到两种文件:程序文件和数据文件。程序文件:包括源程序文件(后缀.c)、目标文件(后缀.obj)、可执行文件(后缀.exe)等,这些文件的内容是程序代码。数据文件,文件的内容不是程序,而是程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他设备)的数据,或在程序运行过程中供读入的数据,如:一批学生的成绩数据。
为了简化用户对输入输出设备的操作,使用户不必去区分各种输入输出设备之间的区别,操作系统把各种设备都统一作为文件处理。(例如键盘是输入文件、显示屏和打印机是输出文件)。所谓”文件“一般指存储在外部介质上数据的集合(一批数据是以文件的形式存放在外部介质(如磁盘)上的)。
流,输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流,即数据流。
一个文件要有一个唯一的文件标识:包括(1)文件路径;(2)文件名主干;(3)文件后缀。如:D: \CC \temp \file1.dat
文件的分类:根据数据的组织形式,数据文件可分为:ASCII文件和二进制文件。数据在内存中以二进制的形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称为映像文件。ASCII文件又称为文本文件(text file),每一个字节放一个字符的ASCII代码。
在磁盘上,字符一律以ASCII形式存储,数值型数据既可以用ASCII也可以用二进制存储。
ANSI C标准采用”文件缓冲系统“处理数据文件。所谓文件缓冲系统是指系统自动地在内存区为程序中每个正在使用的文件开辟一个文件缓冲区。文件缓冲区作用:程序数据区——输入(或输出)文件缓冲区——磁盘。
文件类型指针:FILE *文件名,如FILE *f1。它是指向一个文件的文件信息区(存放这文件的有关信息的地方)。
打开文件,所谓的”打开“,是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。
用二进制方式向文件读取一组数据:它们一般调用形式:读入:fread(buffer,size,count,fp);输出:fwrite(buffer,size,count,fp);其中buffer是地址,size:要读写的字节数,count:要读写多少个数据项(每个数据项的长度为size)。注意,打开文件时要使用二进制形式,如:fopen(”file1“,”wb“)。
(2)用fseek函数改变文件位置标记,fseek函数的调用形式为:fseek(文件指针,位移量,起始点),起始点可以用0、1、2代替,其中0代表文件开始位置,1代表当前位置,2代表文件末尾位置。起始点名字如表:
例如:fseek(fp,100L,0)将文件位置标记向前移到离文件开头100个字节处。
ferror函数,检查输入输出函数出错的情况,一般调用形式:ferror(fp);出错时返回非0值,未出错返回0值。注意,对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值。
clearerr函数,作用是使文件错误标志和文件结束标志为0。一般调用形式:clearerr(fp)。