C语言-结构体/共用体/枚举/文件

本文详细介绍了C语言中的结构体、结构体数组、结构体指针及链表处理,共用体类型、枚举类型以及typedef声明新类型名的用法。此外,还阐述了文件的输入输出操作,包括ASCII文件与二进制文件的读写、文件的打开与关闭以及错误检测。

结构体(也是一种数据类型)

1,概念:由不同类型数据组成的组合型的数据结构。
2,声明:如,
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
3,定义:
①struct Student stdent1,student2;
②struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stdent1,student2;
③struct
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stdent1,student2;
4,访问里面的成员变量:student1.num

结构体数组

1,概念:每个数组元素都是一个结构体类型的数据。

结构体指针

1,概念:指向结构体变量的指针。(一个结构体变量的起始地址就是这个结构体变量的指针)
2,->指向运算符用法:
———–(* p).num;可以写成p->num;表示:
———–p所指向的结构体变量中的num成员。

用指针处理链表

1,建立链表
①建立简单的静态链表(所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放):
struct Student{
int num;
float score;
struct Student *next;
}
②建立动态链表(在程序运行过程中,从无到有地建立起一个链表)
使用malloc(int size)函数。

共用体类型

1,概念:使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。
2,定义:
union 共用体名
{成员表列;
}变量表列;
例如:
union Date
{
int i;
char ch;
float f;
}a,b,c;
****注意:与结构体的不同表现在,结构体每个成员分别占用其自己的内存单元,所占内存长度为各成员占的内存长度之和;而共用体所占长度为最长的成员的长度。如:上个例题的共用体变量a,b,c各占4个字节。
3,共用体类型数据的特点:
①同一个内存段可以存放几种不同类型的成员,但是每一瞬间只能存放其中一个成员,不能同时存放几个。
②可以对共用体变量初始化,但初始表中只能有一个常量。
③共用体变量中起作用的成员是最后一次被赋值的成员。,前面赋值的被取代。
④共用体变量的地址和它的各成员的地址都是同一地址。
⑤不能对共用体变量名赋值,也不能引用变量名来得到一个值。
⑥共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。
4,例子:
union Categ
{
int clas;
char position[20];
};
struct
{
int num;
char name[20];
char sex;
char job;
union Categ category;
}person[2];

枚举类型

1,概念:如果一个变量只有几种可能的值,则可以定义为枚举类型。
(指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。)
2,声明的一般形式:
enum [枚举名] {枚举元素列表};
例如:
enum Weekday{sun,mon,tue,wed,thu,fri,sat};
定义:enum Weekday workday,weekend;
3,注意:C编译对枚举类型的枚举元素按常量处理,不能对它们赋值——每一个枚举元素都代表一个整数,默认它们的值为0,1,2,3,4,5···

用typedef声明新类型名

1,简单地用一个新的类型名代替原有的类型名:
typedef int Integer;
typedef float Real;
(表示:Integer代表int类型;Real代表float类型)
2,命名一个简单的类型名代替复杂的类型表示方法:
如:
①typedef struct
{
int month;
int day;
int year;
}Date;
②typedef int Num[100]; //声明Num为整型数组类型名
③typedef char * String;
④typedef int (* Pointer)();
总结:按定义变量的方式,把变量名换上新类型名,并且在最前面加上“typedef”,就声明了新类型名代表原来的类型。
3,#typedef int Count;和#define Count int;的区别:
后者是在预编译时处理的,只能作简单的字符串替换;而前者是在编译阶段处理的,不是作简单的字符串替换。
补充:
(1)
C 编译系统在对程序进行通常的编译之前,首先进行预处理。C 提供的预处理功能主要有以下三种:
①宏定义 
②文件包含 
③条件编译
(2)
①编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
②解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!
③区别:
编译型语言,执行速度快、效率高;依靠编译器、跨平台性差些。
解释型语言,执行速度慢、效率低;依靠解释器、跨平台性好。

对文件的输入输出

1,什么是文件?(存储在外部介质上数据的集合)
①程序文件。如后缀为.c/.obj/.exe等。文件内容是程序代码。
②数据文件。文件内容不是程序,而是供程序运行时读写时的数据。如一批学生的成绩数据、货物交易数据等。
2,文件的分类:
ASCII文件(文本文件)和二进制文件(映像文件)。——①在内存中是以二进制形式存储的。②每一个字节放一个字符的ASCII代码。
3,文件类型指针(文件指针):
FILE *p;指向文件型数据的指针变量。——包含在“studio.h”中。
(通常将这种指向文件信息区的指针变量简称为指向文件的指针变量。)
4,打开和关闭文件
①用fopen函数打开数据文件:fopen(文件名,使用文件方式);
如:fopen(“a1”,”r”);——返回值是指向a1文件的指针(即a1文件信息区的起始地址)。
补充:r/rb—只读;w/wb—只写(没有时会新建,有也会先删除再新建);a/ab—追加。在后面加一个“+”,表示既可以输入数据,也可以输出数据。如:r+。
②3个标准的流文件:
标准输入流、标准输出流、标准出错输出流
3个文件指针变量:
stdin/stdout/stderr(分别指向3个标准流文件)
③用fclose函数关闭数据文件
fclose(文件指针);——–成功关闭返回0,否则,返回-1
5,顺序读写数据文件
(1)向文件读写字符
①fgetc(fp);表示从fp指向的文件读入一个字符。成功,返回所读字符;失败,返回-1。
fputc(ch,fp);表示把字符ch写到文件指针变量fp所指向的文件中。成功,返回输出的字符;失败,返回-1。
补充:exit(0);是标准C的库函数,作用是使程序终止,在“stdlib.h”头文件中。
②feof函数:检查到文件读写位置标记是否移到文件的末尾(磁盘文件是否结束)。
用法:FILE * in; feof(in); ——函数值为1(真),否则为0(假)。
(2)向文件读写字符串
①fgets(str,n,fp);—–从fp所指向的文件中读入一个长度为n-1的字符串,并在最后加一个’\0’字符,然后把这n个字符存放到字符数组str中。——成功,返回地址str;失败,返回NULL。
fputs(str,fp);—–把str所指向的字符串写到文件指针变量fp所指向的文件中。—–成功,返回0;失败,返回非0(为EOF);
(3)用格式化的方式读写文件
①fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
注意:以上两个函数分别于printf和scanf函数类似,区别在于:它们的读写对象不是终端而是文件。
②以上两个函数的使用:输入时,需将文件中的ASCII码转换成二进制形式再保存在内存变量中;输出时,需将内存中的二进制形式转换为字符。
(4)用二进制方式向文件读写一组数据
①fread(buffer,size,count,fp);——成功,返回输入数据项的个数(count)。
fwrite(buffer,size,count,fp);——成功,返回输出数据项的个数(count)。
6,随机读写数据文件
(1)文件位置标记及其定位
①rewind函数:使文件位置标记指向文件开头
rewind(fp);——无返回值
②fseek函数:改变文件位置标记——一般用于二进制文件。
fseek(文件类型指针,位移量,起始点);——起始点用0,1,2代替。0表示“文件开始位置”;1表示“当前位置”;2表示“文件末尾位置”。
“位移量”指以“起始点”为基点,向前移动的字节数;“位移量”是long型的数据,在末尾加一个L表示。
③ftell函数:测定文件位置标记的当前位置。
ftell(fp);——成功,返回文件当前位置(相对于文件开头的位移量);失败,返回-1L。
7,文件读写的出错检测
(1)ferror函数:
ferror(fp);—–返回值为0(假),未出错;返回值非0,出错。
(在执行fopen函数时,ferror函数的初始值自动置为0)
(2)clearerr函数:使文件错误标志和文件结束标志置为0。
clearerr(fp);—–若ferror函数的返回值不为0,调用它,使ferror的值变为0,以便下一次的检测。

总结

1,逗号表达式:
①从左往右依次计算表达式。
②逗号表达式作为一个整体,它的值为最后一个表达式的值。
③逗号运算符的优先级别在所有运算符中最低。
2,典型例题:
①int i=3;
printf(“%d,%d,%d\n”,i,++i,++i);
输出:5,5,4
(自右至左的顺序求函数参数的值)——这个顺序,C标准没有规定,但是C编译程序都规定了自己的顺序。程序员尽量做到从左到右和从右到左都是一样的结果。
②int i=3;
printf(“%d,%d,%d\n”,i,i++,i++);
输出:3,3,3
(自右至左的顺序求函数参数的值,且是在执行完printf语句后再使i+1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值