二十一、枚举类型
1、枚举类型是一种基本类型,不是构造类型,被说明为枚举类型的变量只能取枚举列表中的值。
2、定义枚举类型:enum 枚举类型名{枚举值列表}; 定义枚举类型变量:enum 枚举类型名 变量名;
3、枚举变量也可以同时定义:enum 枚举类型名{枚举值列表} 变量名;初始化必须是枚举值;
4、枚举变量的默认值类似数组下标,手动赋值其后的值依次加一;
5、typedef关键字:自定义类型说明符,typedef 原类型名 新名;
6、预处理指令:以#开头的指令,是在编译之前做的工作,写在函数前;
7、宏的概念:被定义为‘宏’的特殊标识符为‘宏名’,预处理时对宏名进行宏代换;
1)无参宏定义:#define 宏名 字符串(字符串可以使常数、表达式、格式串);
2)宏的作用域:字符串中出现的宏名不替换,#undef 宏名 取消宏定义,宏定义允许嵌套;
3)宏也可以定义新的类型名,定义输出格式等;
4)有残宏定义:#define 宏名(形参表列) 字符串;形参间可以有空格,宏名和形参之间不能有空格;
5)有参宏求最大值:#define MAX(a,b) a>b?a:b
8、条件编译
1)#if-#elif-#else-#endif条件编译:预处理阶段根据条件不同编译不同代码段,生成不同大小的文件,且条件判断的是宏定义的值;
2)#ifdef-#else-#endif条件编译:检测宏定义,是即执行语句;#ifndef-#else-#endif条件编译:检测宏定义,否执行语句;
3)条件编译实现调试BUG
二十二、文件
1、static和extern修饰变量和函数
1)修饰局部变量: static修饰定义的局部变量是静态变量作用域延长不会释放,定义语句执行一次;extern不能修饰定义局部变量;
2)修饰全局变量: static修饰定义的全局变量只能在定义文件中使用,不同文件可以定义同名变量;extern修饰定义全局变量只要声明包含的文件都可以使用,但不能定义同名变量,全局变量默认都是extern默认初始值是0,声明可以省略extern;
3)修饰函数: static修饰定义的函数只能在定义文件中使用;extern修饰定义函数只要声明包含的文件都可以使用, 默认都是extern可以省略。
2、文件 :存储在外部介质上的数据的集合,集合名叫文件名,操作系统以文件为单位进行数据管理。
1)文件分类
A、从用户角度分为拍普通文件和设备文件
B、从文件编译方式分为ASCII码文件和二进制码文件(流式文件)
2) 文件操作步骤:引入头文件(stdio.h)->定义文件指针->打开文件->文件读写->关闭文件;
3)文件操作原理:文件数据输入时先在内存区开辟文件缓冲区以流传输数据到数据区;输出数据时相反。
3、C语言文件指针:指向文件的指针(结构类型指针),存的是文件首地址;
1)定义形式:FILE *指针变量标识符;
2)文件打开:文件指针名 = fopen(文件名,使用文件方式);,文件名是字符串常量或字符串数组;文件在products/debug
3)文件关闭:fclose(文件指针);,与打开对应不关闭可能造成写入失败;
4) 文件使用方式和注意事项
A、 文本文件读写要先转码,速度比二进制码文件慢;
B、标准文件由系统打开可直接使用;
C、打开文件出错返回空指针值NULL ,常用打开文件程序段:
#include<stdio.h>
int main (){
FILE *fp = fopen("a.txt","r");
if (fp!=null) {
//文件打印成功
}else{//文件打印失败
printf("文件读取失败!按任意键退出");
getch();//输入任意字符
exit(1);//程序退出
}
fclose(fp);
return 0;
}
4、文件读写函数 fgetc和fputc:以字符(字节)为单位的读写函数,每次可从文件读出或向文件写入一个字符;
1)fputc字符写入函数 :调用形式-fputc(字符量,文件指针);,字符量可以是字符常量或变量(fopen以w和w+打开文件);
2)fgetc字符读取韩式:调用形式-fgetc(文件指针);,fopen以r和+打开文件,连续读取文件内部指针默认加一,可以用默认结束标志EOF(宏定义-1)来判断;
练习:保存键盘输入字符串并读取
#include <stdio.h>
int main(int argc, const char * argv[]){
//定义变量
char ch;
//打开文件
FILE *fp = fopen("inputstring.txt","w+");
//判断文件是否打开成功
if (fp != NULL){
//提示用户输入一个字符串
printf("请输入要保存的字符串:\n");
//接受,循环写入到文件中
ch = getchar();
int count = 0;//定义计数器
//判断是否输入了\n
while(ch != '\n'){
count++;
fputc(ch,fp);//把字符保存到文件
ch = getchar();//获取下一个字符(循环写入)
}
printf("本次共写入了%d个字符\n",count);
rewind(fp);//文件指针重新指向首地址
count = 0;
//从读取一个字符
ch = fgetc(fp);
while (ch != EOF){
count++;
//读取出来显示到控制台
putchar(ch);
//读取下一个字符(循环显示)
ch = fgetc(fp);
}
printf("\n本次共读取了%d个字符\n",count);
}
//关闭文件指针
fclose(fp);
return 0;
}
5、字符串的文件读写函数:fgets和fputs
1)写入函数:fputs(str,fp);,函数返回值为字符个数;
2)读取函数:fgets(str,sizeof(str),fp);,遇到\n和EOF读取结束并自动加\0;
6、数据块读写函数:fread和fwrite
1)读数据函数:fread(buffer,size,count,fp);
2)写数据函数:fwrite(buffer,size,count,fp);
练习:文件的结构体读写
#include <stdio.h>
struct student{
char name[21];
int age;
float score;
};
int main(int argc, const char * argv[]){
//定义结构体数组
struct student stu[3] = { { "张三丰", 28, 59.99f }, { "zbz", 32, 66.66f }, { "cgx", 24, 100.00f } };
//打开文件
FILE *fp = fopen("student.data", "wb+");
//判断文件是否打开成功
if (fp != NULL)
{
for (int i = 0; i < 3;i++)
{
fwrite(&stu[i], sizeof(struct student), 1, fp);
}
printf("写入成功!\n");
rewind(fp);//文件指针重新指向首地址
struct student stu2[3];
for (int i = 0; i < 3; i++)
{
fread(&stu2[i], sizeof(struct student), 1, fp);
printf("姓名:%s 年龄:%d 成绩:%.2f\n", stu2[i].name, stu2[i].age, stu2[i].score);
}
}
//关闭文件指针
fclose(fp);
getchar();
return 0;
}
7、格式读写函数:fprintf和fscanf
1) fprintf(文件指针,格式字符串,写入表列);
2) fscanf (文件指针,格式字符串,写入表列);
练习:读取和写入二维数组
#include <stdio.h>
int main(int argc, const char * argv[]){
//定义数组
int a[3][2] = { 1, 2, 3, 4, 5, 6 };
//打开文件
FILE *fp = fopen("arr.txt", "w+");
//判断文件是否打开成功
if (fp != NULL)
{
for (int i = 0; i < 3; i++)
{
fprintf(fp, "%d,%d#", a[i][0], a[i][1]);
}
printf("写入成功!\n");
rewind(fp);//文件指针重新指向首地址
int arr[3][2];
for (int i = 0; i < 3; i++)
{
fscanf(fp, "%d,%d#", &arr[i][0], &arr[i][1]);
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
//关闭文件指针
fclose(fp);
return 0;
}
8、文件的随机读写实现文件定位:文件内部指针移动函数
1)rewind(文件指针);
2)fseek(文件指针,位移量,起始点) ;
3)文件检测函数 feof(文件指针);判断文件是否结束,返回值1为是0为否,总是会多执行一次不如EOF;
4)文件检测函数ferror(文件指针);检查文件读写时是否出错,返回值0为否其他为是;
5)文件错误标志和文件结束标志置0函数clearerror(文件指针); |
|