A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© maoxiaomi 中级黑马   /  2015-7-23 19:42  /  752 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

二十一、枚举类型
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(文件指针);

3 个回复

正序浏览
好详细!!!
回复 使用道具 举报

手打强化记忆,也不是很多{:2_31:}
回复 使用道具 举报
纯手打?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马