自学笔记-C语言复习2015年7月23日

二十一、枚举类型
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(文件指针); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值