个人的C语言笔记

微笑

c语言指针

 

指针即地址,是常量; 指针变量是指取值为地址的变量,是变量(专门储存地址的变量)。

 

int *pa;(int *p = &a

p = &a(地址);表示该指针指向改地址,所以*p就等于a

 

c语言不允许直接把一个数值赋值给指针变量,以下做法是错误的:

int *p;

p = 20

若使用printf“%#0x”, &a;得到的16进制地址能否直接使用p = 0x0012FF7C进行赋值:

无论哪种进制的数值均不可以直接赋予一个指针变量。

 

指针的自增自减:一个指针“+or-”一个常量n后的新位置,是在原有指向基础上加上或减去“sizeof(指针数据类型)* n

 

 

多级指针:

 

int i, *p, **q;

q = &p

定义指针变量q,它指向另一个指针变量,而它指向的指针变量又指向一个整形变量。

**q = **q):q指向p*q访问的是p, 而p又指向i*p访问的是i,因此*qq访问的是i

 

指针与数组:

 

int a[10], *p;

p == a == &a[0];         p == a == a[0];

 

p+n == a+n == &a[n];    *(p+n) == *(a+n) == a[n] == p[n];实际上在编译时a[i]就是处理*(a+i);

 

p++是合法的而a++是非法的,因为a是数组首地址为常量不能进行自增自减。

 

对一个数组的引用:

①下标法:a[i];

②地址法:*a+i);

③指针法:*(p+i)p[i];

 

数组指针做函数参数:

 

1、实参数组名代表一个固定的地址,是一个指针常量;但是形参数组名并不是一个固定的地址,而是按指针变量处理;

2、定义函数int sub_max(int b[], int n) == int sub_max(int *b, int n).编译时数组b按指针变量进行处理。

 

 

 

 

 

 

 

指针与二维数组:

 

int a[3][4];即3个一维数组,a[0], a[1], a[2],每个一维数组又含有4个元素。用地址法表示二维数组。

 

int (*p)[4]

其中p的类型为int*[4];它指向包含4个元素的一维数组,是一个行指针。指针的长度是固定的,与基类型无关, sizeofp)是定值。

 

 

①用地址法表示a[i][j;首先要得到行地址a+i,然后转化为列地址*a+i)【即进入一维数组里面(行)】;再加上列变化j, 即*a+i+j,得到a[i][j]的地址,再取值**a+i+j);

 

②行列指针(地址)的相互转换:*(行指针)——> 列指针; &(列指针) ——> 行指针;

 

③例取出a[1][2]: **a+1+ 2)或 **a+6);*a是列指针, *a + 1*4 + 2(从a[0][0] a[1][2]需要向后数到第六个位置)即*a+6仍为列指针;

 

④指向a[0][0]元素的指针有:列指针*a, a[0], &a[0][0]; 行指针a, &a[0], &*a;  &*a == a.

 

 

 

内存动态分配:

 

malloc(在内存的动态储存区分配 一块 长度为size字节的连续区域【(类型说明符 *mallocsize)】)

calloc (在内存的动态储存区分配 n块 长度为size字节的连续区域【(类型说明符 *callocnsize)】)

释放内存函数freevoid *p

 

 

 

指针与字符串:

char c, *p = &c;表示一个指向字符变量c的指针变量;

char *ps = computer Department”表示ps是一个指向字符串的指针变量;‘\0’为字符串结束标志, ‘\0’的ASCⅡ码为0

 

例如:char *ps = this is a desk”;初始化过程中把字符串的首地址赋予了ps, 当执行ps = ps+10ps指向字符d,因此输出desk

 

字符串指针变量与字符数组的区别: 字符串指针变量本身是一个变量,用于存放字符串的首地址;字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束;字符数组是由若干数组元素组成的,它可用于存放整个字符串。

 

char *ps = “Computer Department”;   可以改写为 char *ps; ps = “Computer Department”;

char str[] = “Computer Department”;   不能改写为 char str[50]; str = “Computer Department”;

只能对字符数组的各个元素逐个赋值。

 

指针数组:

 

这类数组存放的是具有相同存储类型和指向相同数据类型的指针,分别用于指向某种变量,这种数组称为指针数组。【指针数组的每个元素被赋予二维数组每一行的首地址,可以理解为每个元素指向一个一维数组】

 

类型说明符 *数组名[数组长度];  例如:int *p[4] 由于[]的优先级比*,所以首先是数组形式p[4], 然后才与*结合。

 

指针数组和二维数组指针变量的区别:

 

二维数组指针变量是单个的变量其一般形式为(*指针变量名)两边的括号必不可少;

int *p[3]:该二维数组有3列或分解为一维数组长度为3

 

指针数组类型表示的是多个指针(一组有序指针),一般形式为 *指针数组名 两边不能有括号;

int *p[3]p是一个指针数组, 3个下标变量p[0], p[1], p[2]均为指针变量;

【指针数组还常用来表示一组字符串,这是指针数组的每个元素被赋予一个字符串的首地址】

 

 

 

带参数的main函数:

 

main函数的参数只能从程序外传递而来; 形式:int mainint argcchar *argv[]{......}

形参包含一个整形变量和一个指针数组。

 

一条完整的命令包括两个部分:命令与相应的参数:命令 参数1 参数2 .....参数n;称为命令行,命令行中的命令就是可执行文件的文件名(windows下为.exe),其后所跟参数需要用空格分隔开。

 

例如:program str1 str2 str3 str4 str5 对于main函数来说,它的参数argc记录了命令行中 命令 与 参数的个数6;指针数组的大小由参数argc的值来决定,指针数组argv中的各

指向一个字符串,整形变量argc表示命令行中参数的个数(注文件名本身也是个参数)

 

 

 

指针与函数:

 

指针形函数:

返回指针值的函数称为指针型函数; 形式:类型说明符 *函数名(形参表){函数体}

*表示这是一个指针函数,返回值是一个指针。

 

指向函数的指针变量:

类型说明符 (*指针变量名)();int *p)()表示p是一个指向函数入口的指针变量,该函数的返回值是整形。【int *pmax)(intint);pmax = max<==> int maxint int)。pmax = max pamx获得max函数的首地址(入口地址)】

 

调用函数的一般形式:(*指针变量名)(实参表);

 

 

小结:

①不同类型指针的定义

int i, *p,  **p, a[n], *p[n], (*p)[n], *p(), (*p)();

 

②指针的运算

自增自减:将指针变量的原值和它指向的变量所占用的内存单元字节数加减;

指针变量的赋值:将一个变量的地址赋值给一个指针变量;

指针变量可以有空值,p = NULL,表示指针变量不指向任何变量;【NULL是整数0,是一个符号常量,它使储存单元所有二进制位均为0

若两个指针变量指向同一数组的元素,则两指针变量的差是两个指针之间元素的个数;

 

③数组和指针:

定义数组时必须指定数组的类型和大小, 定义指针只需定义类型;

对于指针在使用时不仅所指的区域可以读写, 连指针变量本身也可以读写;但是数组名只允许读,因为数组名系统没有为它分配储存空间;

数组名不可以自增自减,指针变量则可以;

 

④指针函数和函数指针:

指针函数是指返回值为指针的函数, 本质一个函数;

函数指针是指向函数的指针变量, 本质是一个指针变量, 只不过该指针只能指向某类函数;

 

 

 

 

 

 

C语言结构体和共用体:

 

结构体类型的定义:

 

在使用结构体变量之前,要先定义结构体类型, 再定义结构体变量;

结构体类型的定义:

struct 结构体名

{

类型标识符 成员名1

类型标识符 成员名2

       ....

类型标识符 成员名n

}②变量名1, 变量名2..., 变量名n

结构体变量的定义与引用:

 

定义结构体类型只能说明这个结构体如何, 还应定义一个结构体变量对它进行引用;

①先定义类型再定义变量:struct 结构体名 变量名;可以随时增加更多的变量;

②在定义类型同时定义结构体变量;

③直接定义结构体变量;

struct

{

}变量名1, 变量名2.... 变量名n;这种方法直接定义结构体变量,省略了结构体类型名,结构体变量在定义的同时可以对其进行初始化;

struct 结构体名

{

结构体成员列表;

}变量名 = {, , };不进行初始化的成员项也要用“,”来跳过;

 

结构体变量的引用:结构体变量名.成员名, “.”为成员运算符, 自左向右结合;

 

结构体数组的定义与引用:

struct 结构体名

{

结构体成员列表;

}

struct 结构体名 结构体变量[]; 结构体变量是一个数组,每一个数组元素又是一个结构体类型;

 

指向结构体的指针:

 

指向结构体变量的指针:

struct 结构体名 *结构体指针变量名;

访问结构体成员:(*结构体指针变量).成员名 或 结构体指针变量->成员名;

 

指向结构体数组的指针:

 

该指针就是整个结构体数组的起始地址;一个结构体指针变量虽然可以用来访问结构体变量或结构体变量的成员,但是不能使它指向一个具体成员。

p = &stu[1].num;这是错误的; 只能是p = stu p = &stu[0];

 

 

 

 

 

链表:

 

尾插法创建动态链表:新建的结点总是在链表的末尾插入;

说明:

①设有3个指针变量headpq 他们用来指向struct node 类型数据。先使head的值为NULL,这是空表的情况(即head不指向任何结点),再用malloc函数开辟一个新的结点,并使pq指向它;然后在键盘读一个数据给p所指结点的数据域, 约定该数据不为0(这只是举个例子,表示不合法数据),如果输入0则表示建立链表过程完成,存储数据0的结点不应该链接到链表中;

 

②如果输入p->data = 0;则输入的是第一个节点数据(n == 1),令head = p, 使head指针也指向新开辟的结点,然后在开辟一个结点再使p指向它,接着输入该结点的数据。若输入的p->data != 0;则应链入第二个结点(n == 2),由于n = 1,则将p的值赋给q -> next,此时q指向第一个结点, q -> next指向第二个结点,每次将新节点链入链表之后q会向后移一次,指向链表表尾;q = p;【循环】

③循环输入结束后应使q->next = NULLfreep);returnhead);

 

 

 

头插法创建动态单链表:按结点的逆序方向逐渐将结点插入到链表的头部,所创建的链表是逆序的,即第一个输入的结点实际是链表的最后一个结点。

说明:

       ①设有3个指针变量headpq 他们用来指向struct node 类型数据。先用malloc函数开辟一个新的结点,并使phead指向它;并且使它的下一个结点为NULL(即head->next = NULL)然后在键盘读一个数据给p所指结点的数据域, 约定该数据不为0(这只是举个例子,表示不合法数据),如果输入0则表示建立链表过程完成,存储数据0的结点不应该链接到链表中;

②如果输入p->data = 0;则输入的是第一个节点数据(n == 1),令q = p, 使q指针也指向新开辟的结点,然后再开辟一个结点再使p指向它,接着输入该结点的数据。若输入的p->data != 0;则应链入第二个结点(n == 2),由于n = 1,则将q的值赋给p -> nexthead = p;此时head指向第二个结点, p->next指向第一个结点;q = p每次将新节点链入链表之后q会向前移一次,指向链表表头;【循环】

       ③循环结束后freep);return head);

 

 

单链表的基本操作:

插入:s->next = p->nextp->next = s

删除:p->next = p->next->next【逻辑上的删除】;或 temp = p->nextp->next = temp->nextfree(temp)【连空间也释放的删除】;

 

 

 

 

 

共用体类型的定义与应用:

 

共用体类型是指将不同的数据项存放在同一段储存单元的一种构造数据类型,它的类型说明与变量定义和结构体的方式基本相同。【在程序的某一时刻只有一个共用体成员起作用, 不能引用共用体变量也不能对其赋值,只能引用体变量中的成员】

union 共用体名

{

      共用体成员列表;

}

union 共用体名 变量名;

 

 

枚举类型的定义与应用:

 

凡是属于该类型变量的值都一一列举出来的一种数据类型。【每个枚举常量都有一个默认的整数值(默认第一个枚举常量对应0,类推),但在定义枚举类型时可以给枚举常量赋初值; 输出枚举常量时只能将其视作一个整数值】

enum 枚举名{枚举常量列表}

enum week{SundayMondayTuesdayWednesdayThursdayFridaySaturday}

enum week day

 

int numscanf“%d”, &num); day = enum weeknum/*强制类型转换*/switchday);

 

 

typedef 重定义类型名:

 

typedef 已有类型名 新类型名;给已有的类型取一个新名字。

例如:

typedef  char  CHAR

typedef  int    INT

则:

CHAR c<==>  char c

INT  i<==> int  i;

 

通常利用typedef来简化构造类型的类型名:

typedef  struct  node

{

      int data;  

      struct  node *next

}NODE

typedef  NODE  *Ps

NODE s

Ps  p = &s

其中NODE是结构体类型名, 替代struct nodePs为指向结构体类型的指针类型名,代替struct node *

 

typedef #define#define是宏定义,只是简单的替换,是在预编译时处理的;而typedef是给已有类型取个新名字,是在编译时处理的,完全可以替换掉原来的类型名,有利于程序的通用和移植。

 

 

 

 

 

预编译处理:

 

#开头, 结尾不加分号并且可以放在任何位置,从定义开始作用到文件结束或者用#undef 标识符来结束该宏的作用范围。

 

宏定义与宏替换: #define 标识符 字符串 或 #define 标识符(形参表) 形参表达式【标识符与括号之间不可以有空格; 宏名后的实参表达式括号的有无直接影响替换的内容】;  不分赔储存空间,也不做正确性检查;多次使用宏,宏展开后会使源程序变长, 因为每一次宏开展后都会使源程序增长;而函数调用不会。

 

例如:#define Txx*x   printf(“%d”,Ta+b))/*T( a+b)替换成a + b * a + b */

 

文件包含:          #include <包含文件名>【预处理程序在标准目录下查找指定的文件】 或 #include “包含文件名”【预处理程序首先在引用被包含文件的源文件所在的目录中寻找指定的文件,若没找到再按照系统指定的标准目录查找】

 

 

 

 

条件编译:

 

第一种形式: 若标识符已经被#define定义过,则对程序段1进行编译;否则对程序段2进行编译。若没有程序段2 本格式中#else可以省略。

 

#ifdef 标识符

程序段1

#else

程序段2

#endif

 

 

第二种形式: 如果标识符未被#define定义过,则对程序段1进行编译;否则对程序段2进行编译。

 

#ifndef 标识符

程序段1

#else

程序段2

#endif

 

 

第三种形式:  如常量表达式的值为真(非0),则对程序段1进行编译;否则对程序段2进行编译。

 

#if 常量表达式

程序段1

#else

程序段2

#endif

 

 

 

 

 

位运算:

 

字节(Byte):是计算机中的存储单元。1字节可以存放一个英文字母或符号,一个汉字通常要用两个字节来存储。每个字节都有自己的编号,叫做“地址”。

 

位(bit): 是计算机中最小的存储单位。1字节由8个二进制位构成,每位的取值为01.最有端的称为“最低位”,编号为0;最左端的称为“最高位”。(0~78位)

 

字(word):是由若干字节组成的一个单元。一个字可以存放一个指令或数据,至于一个字由几个字节组成取决于计算机的硬件系统。

 

 

 

 

 

原码:  以8位计算机系统为例,我们把最高位(即最左边的一位)留作表示符号,其他7位表示二进制数,这种编码方式称为原码。最高位“0”表示正数,“1”表示负数。

例如:00000011表示+310000011表示-3。显然这样可以表示的数值范围在-128~+127之间。这种表示方式有一个缺陷,数值0有两个原码歧义:00000000表示“+0”或10000000表示“-0”。

 

 

反码:  对于正数反码与原码相同。所谓“反码”是指与“原码”在表示负数时相反:符号位的最高位为“1”表示负数,但其余位的值取反。

例如:11111100表示“-3”,“0”的表示也会有歧义。

 

补码:  对于正数,补码与原码相同。这样“0”的表示唯一,“0”的补码为00000000。对于负数,可以从原码得到补码: 首先符号位不变,为1;其次,其余各位取反。01, 10;最后整个数加1

已知一个数的补码求原码分两种情况:

①如果补码的符号位为“0”,表示一个正数,所以补码就是该原码。

②若果补码的符号位为“1”,表示一个负数,所以:符号位不变,其余各位取反,然后整个数加“1”。

 

计算机中的数据都采用补码的形式。原因在于使用补码可以将符号位与其他位统一处;同时减法也可以按加法来处理。用两个数的补码进行相加时,最高位(符号位)有进位,则进位舍去。

 

 

位运算符和位运算:

 

位运算是以单独单位的二进制为操作对象的运算, 而且操作数只能是整型或字符型。

除按位取反外,其余5个位运算符皆可以与赋值运算符构成复合赋值运算符。

 

左移:x<<要位移的位数

把操作对象的二进制数向左移指定的位, 高位溢出,并在右边补上相应位数的“0”。左移n位相当于原来的数值乘以2n次方。

 

右移:x>>要移位的位数

把操作对象的二进制数向右移动指定的位, 移出的低位舍去;

高位补位分两种情况:

①对于有符号或无符号的正数,右移时左边高位补0

②有符号的负数:右移时左边高位的补位, 取决于计算机系统。如补“0”,称为逻辑右移, 补“1称为算术右移。右移n位相当于原来的数值除以2n次方。

 

 

位域(位段):

 

位域就是把1字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允许在程序中按域名进行操作。

位域定义形式:

struct 位域结构名

{

类型说明符 位域名:位域长度;

}

位域成员的类型必须指定为unsigned int类型;若有意使某位域从下一字节开始,可以使用空域unsigned 0

 

一个位域必须存储在同一字节中, 不能跨两字节, 也就是说一个位域的长度不能超过8位二进制位;

位域可以无位域名, 这时它只用来作填充或调整位置。无名位域是不能使用的。

 

位域的使用格式:位域变量名.位域名;

位域允许用各种格式输出。

 

 

 

 

 

文件:

 

文件是指一组相关数据的有序集; 分为 普通文件 和 设备文件 两种。

 

普通文件: 是指驻留在磁盘或其他外部介质上的一个有序数据集,可以使程序文件, 数据文件等,在使用时才调入内存。操作系统是以文件名为单位对数据进行管理的;

 

设备文件: 是指与主机相连的各种外部设备,如显示器、打印机、键盘等。操作系统把外部设备也看做文件来进行管理, 把它们的输入、输出等同于对磁盘文件的写和读;

 

通常把显示器定义为标准输出文件,在屏幕上显示有关信息对于操作系统来说就是标准输出文件输出数据;

 

通常把键盘定义为标准输入文件, 从键盘上输入信息对于操作系统来说就是从标准输入文件中获取数据。

 

C语言把文件看作字符或字节的序列集合。根据数据的组织形式分为 ASCII文件(又称为文本文件) 和 二进制文件;

 

ASCII文件在磁盘中存放时,每个字节存放一个ASCII码, 每一个ASCII码相应于一个可以显示的字符。

 

二进制文件则是把在内存中的数据, 按其在内存中的存储形式原样输出到磁盘上存放。C在处理这些文件时并不分类型,都看做字符按字节进行处理。输入和输出字符流的开始与结束只由程序控制而不受物理符号(如回车符)的控制,因此把这种文件称为“流式文件”。

 

ASCII码输出时,与字符一一对应, 一字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符,缺点是占的存储空间较多,而且要花费二进制形式与ASCII形式之间的转换时间。

 

用二进制形式输出数值数据, 可以节省外存空间和转换时间,但一字节不能对应一个字符,不能直接输出字符形式; 所以对于需要暂时保存在外存上以后又要输入到内存的中间数据,通常采用二进制形式保存。

 

 

c的文件系统分为 缓冲文件系统(高级磁盘输入输出系统) 和 非缓冲文件系统(低级磁盘输入输出系统)。

 

缓冲文件系统: 系统自动的在内存中为正在使用的文件名开辟一个缓冲区: 从磁盘文件中读取数据时,先将数据读取到缓冲区,然后再从缓冲区将数据快速送到应用程序的中去。

 

非缓冲区文件系统: 系统不为这类文件自动提供文件缓冲区,而是由用户自己根据需要设置。

 

缓冲文件系统输入输出称为标准输入输出(标准I/O),非缓冲文件系统输入输出称为系统I/O

 

 

 

 

 

文件指针:

 

每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息。这些信息保存在一个结构体变量中。该结构体类型是系统定义的,类型名为FILE,在stdio.h中定义为:

 

typedef  struct  

{

short  level;              /*缓冲区“满”或“空”的程度*/

unsigned  flags;           /*文件状态标识*/

char  fd;                 /*文件描述符*/

unsigned  char  hold;      /*如无缓冲区不读取字符*/

short  bsize;              /*级冲区的大小*/

unsigned  char  *buffer;    /*数据缓冲区的位置*/

unsigned  char  *curp;     /*指针,当前的指向*/

unsigned  istemp;          /*临时文件,指示器*/

short  token;              /*用于有效性检查*/

}FILE

 

FILE  *fp;定义一个指向某文件的指针变量fp

 

文件的打开与关闭:

 

FLIE *fp

fp = fopen(文件名, 文件使用方式);若出错fopen将返回一个空指针值NULL;因此常用以下程序段打开文件:

if  ((fp = fopen(“c\\abc”, “rb”)) == NULL

{

printf(“\nerror on open c:\\abc file!”);

getchar();

exit1);

}

 

fclose(文件指针);

 

文件的使用方式由“rwatb+”这六个字符进行组合,个字符的含义如下:

rread读)该文件必须存在;

 

wwrite写)不能存在则创建;存在则删除,重建一个新文件;

 

aappend追加)必须存在,在文件末尾追加;

 

ttext文本文件,可省略不写)

bbanary二进制文件)例:“rb

+(读和写)

 

 

文件的读写:

 

字符读写函数fgetc fputc

 

fgetc(文件指针);从指定文件读入一个字符。使用该函数时必须是以读或写的方式打开文件;在文件内部有一个位置指针,用来指向当前文件的当前读写字节。在文件打开时该指针总是指向文件的第一个字节;使用一次fgetc函数后,该指针向后移一个字节,该指针是由系统自动设置的。

 

fputc(字符量, 文件指针);把一个字符写入到指定的文件中。代写入的字符量可以是字符常量或变量;“写, 读写,追加”若打开一个已有的文件将清除该文件原有的内容,写入从文件首开始,逐个后移;若要保留则以追加的方式打开写入文件末;若不存在则创建一个新文件。

若写入成功则返回该字符, 否则返回一个EOF,可用此来判断是否写入成功

 

rewindfp)用于把fp所指文件的内部位置指针移动到文件头。

 

 

字符串读写函数 fgets fputs

 

fgets(字符串数组名, n, 文件指针);表示从文件中读出的字符串不超过n-1个字符,/0

在读出n-1个字符之前遇到EOF或换行符则读出结束;该函数的返回值是字符串数组的首地址。

 

fputs(字符串, 文件名);向指定文件写入一个字符串。字符串可以是字符串常量、字符数组名、指针变量。

 

 

数据块读写函数 fread fwrite

 

freadbuffersizecountfp);

fwritebuffersizecountfp);

 

说明:

Buffer是个指针,在fread中它存放的是输出数据的首地址; 在fwrite中它存放的是输入数据的首地址;

size表示要读写的数据块的字节数;

count表示要读写的数据块数;

fp文件指针。

 

格式化读写函数 fscanf fprintf

 

fscanf函数 和 fprintf函数与前面使用的scanf函数和printf函数的功能相似,都是格式化读写函数。但是前者的操作对象不是键盘和显示屏,而是磁盘文件。

 

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

 

fprintf(文件指针, 格式字符串, 输出列表);//例如:fprintffp, “%d%6.2f”, it);

 

文件的随机读写:

 

文件定位:

rewind函数(格式: void rewindFILE  *fp);将fp指向的文件中的位置指针指向文件首);

 

fseek函数(格式: int fseekFILE *fplong offsetint base));将文件指针fp所指文件中的位置指针移到距离base偏移offset字节的位置,函数返回值为当前值,否则返回-1

 

说明:

base为起始点,表示从何处开始计算位移量,规定的起始点有三种:文件首、当前文件位置、文件末尾;

【起始点      符号表示         数字表示】

  文件首      SEEK_SET           0

        当前位置     SEEK_CUR          1

         文件末      SEEK_END          2

 

offset为位移量,表示移动的字节数,要求位移量是long型,以便在文件长度大于64KB 时不会出错;当位移量>0时表示向前移;<0时表示向后移;用常量表示位移量是要求加后缀Lfseek一般用于二进制文件中,在文本文件中由于要进行转换,故往往会计算的位置出现错误;

例如:fseekfp50L0);

 

③如果执行fseek函数成功,函数返回0, 失败则返回一个非0值。

 

 

ftell函数:long ftellFILE *fp); 返回文件指针的当前位置(用相对于文件首的位移量表示);返回值为-1L则表示调用出错。

 

文件检测函数:

 

读写文件出错检测函数: int ferror(文件指针);若返回0值表示为出错,否则表示有错;

 

文件出错标识和文件结束标识置0函数: void clearerr(文件指针);

 

文件结束检测函数: feof(文件指针);判断文件是否处于文件结束位置,如文件结束返回1,否则返回0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值