第六章、剩余内容

(预处理指令,宏定义,条件编译,文件操作)

预处理指令

简单的来说就是在程序编译之前需要做的事情

  1.  

1.宏定义

概念:

是一个替换代码的预处理指令,可以在编译之前进行代码替换(宏展开,条件编译,文件包含).

当需要用一些重复性代码或简单的函数运算时,可以用宏定义.提高效率

用法:

开始替换: #define 被替换内容  替换成的内容

如:

#define ka1 6

表示从这行开始下面所有代码中的ka1 替换成6

结束替换:

#undef 被替换内容

如: #undef  ka1   表示到一行, 宏定义失效

特点:

  1. 命名尽量以大写或小写k开头.便于区分.(规范)
  2. 被双引号的引起来的不会被替换
  3. 宏定义只会做代码替换,不会关注任何逻辑,容易出现优先级错误(加括号解决).
  4. 替换可以设置作用域.如果不设置,作用域则是这行代码出现到代码的最后一行.

2.条件编译

概念:

是一个根据条件编译代码的预处理指令,可以让一段代码只在满足条件才编译.提高编译效率

使用:

#if 条件表达式

#elif 条件表达式

#else

与宏定义相关:

#ifdef 宏名 表示定义了宏

#ifndef 宏名 表示没有定义宏

#endif 结束条件编译.注意一定要加.

四,什么时候用?

当一些代码只需要在一定条件下编译时.

五,有什么特点?

1.条件编译不能访问需要编译后才能执行的代码.

2.条件编译不需要用大括号,所以必须加上结束标识,否则涵盖下面的所有代码.

3.条件编译一般跟宏定义配合使用,防止重复包含及交叉包含.

头文件

一,是什么?

是C语言中以.h结尾的文件,如stdio.h .

二,有什么用?

用于声名(描述)一个函数,把多个代码文件(如a.c;b.c;…)中的函数,声明在这个文件中,以便于重用 、防止定义的冲突.

三,怎么用?

定义:   新建一个以.h结尾的文件,把需要用到的函数的声名直接放在里面.

引用:   自定义的头文件:#include  “头文件名.h”

编译器类库里的头文件:#include  <头文件名.h>

四,什么时候用?

当程序需要由多个c文件组成时.

五,有什么特点?

1.在头文件中仅做声名,不做具体实现

2.在头文件有声名只能确保编译成功成.o文件;但不确保能链接成功.

3.自定义的头文件引用时必须要有路径.

#include的使用

一,是什么?

是C语言中的一个预处理指令.

二,有什么用?

用于把一个文件的内容拷贝到这行命令所在的位置.

三,怎么用?

引用:  自定义的文件:#include  “文件路径和名称”

编译器类库里的文件:#include  <文件名>

四,什么时候用?

当程序需要用到别的文件时.

文件操作(OC中有单独的文件操作方法,这里作为了解)

概念:

是对文件或文件内容的输入(读)与输出(写). 文件操作的函数在<stdio.h>中声名.

文件的操作流程:

1)导入头文件 stdio.h

2) 定义文件指针

3)打开文件

4)操作文件

5)关闭文件

操作原理:

3、文件指针
FILE 结构体
FILE *fp; 结构体指针
作用:存储一个文件的首地址,指向一个文件

 

4、文件的打开和关闭

打开 fopen(文件名,操作方式);

  1. fopen("a.txt","r");

//a.txt默认的去products目录去 找,/Users/apple/Library/Developer/Xcode/DerivedData/C15-综合项

目- cmassyrpkwjxularuygrjqhojbwj/Build/Products/Debug

fopen("/Users/apple/Desktop/a.txt","r");

操作方式:

rwab+t  : 读写追加二级制读写文本

w -- 写入文件的时候,如果文件不存在,则创建存在则覆盖

r+ w+ wb+ a+

关闭文件:  fclose(文件指针);

5、文件操作的函数
1) 字符型数据的读取和写入

写入:
fputc('字符',文件指针);

char c='A';

fputc(c,fp);

读取:

char ch = fgetc(fp); 2)字符串类型数据的读取和写入

写入:
fputs(数组名/指针名,fp); //fputs(数组名,stdout);

读取:

fgets(数组名/指针名,长度,fp);

fgets实际读取的字符个数是长度-1

1)遇到\n 结束,遇到EOF也会结束

3)数据块的读取和写入

写入:

fwrite(写入的变量地址,数据块的大小,块数,fp);

int a =123;
fwrite(&a,sizeof(int),1,fp);

struct Student stu1;

fwrite(&stu1,sizeof(struct Student),1,fp);

读取:

struct Student s1;

fread(变量的地址,数据块的大小,块数,fp)

fread(&s1,sizeof(struct Student),1,fp); //使用s1进行输出

4)格式化的读取和写入

写入数据和读取数据按照一定的格式进行

写入:

fprintf(文件指针,"格式化的字符串",变量列表);

fprintf(fp,"%d,%c,%d#",10,'a',20);

10,a,20#10,a,20#10,a,20#

读取

fscanf(fp,"%d,%c,%d#",&a,&ch,&b);

fprintf(fp,"%d,%s,%d",20,"abc",30);

fscanf(fp,"%d,%s,%d",&a,str,&b);

str = abc,30

改成:

fprintf(fp,"%d,%d,%s",20,20,"abc");

fscanf(fp,"%d,%d,%s",&a,&b,str);

6、文件的随机读取

设定文件的头指针的位置

默认fp是指向文件的首地址

1)rewind(fp); //fp指向首地址

2)fseek(fp,偏移的距离,起始点);

fseek(fp,32L,SEEK_SET); //从文件头部开始,偏移32个字节

7、文件的检测函数

feof() 用来检测文件是否到了末尾

如果没有到末尾 0

到末尾 1

缺点:多执行一次

 

特点:

1.打开文件的模式限定操作的方式.

2.打开操作文件后一定要关闭文件,否则容易引起内存泄漏.

3.输入与输出是相对于操作者而言.

C语言学习总结(四) 剩余内容的更多相关文章

  1. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  2. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  3. C语言学习第四章

    今天学习C语言循环结构,为什么要用循环呢?因为有时候我们对一堆的数字进行重复的处理的时候要重复的编写一些相同或者差不多的代码,让程序显得很臃肿,而且写着也麻烦,如果用循环来写的话能简化很多,出错的话也 ...

  4. Go语言学习笔记(四) [array、slice、map]

    日期:2014年7月22日   一.array[数组]   1.定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内 ...

  5. Swift语言学习(四)字符串与Array等集合的使用

    Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提 ...

  6. [C语言学习笔记四]变量与系统的交互

    使用 const 创建常量和使用 volatie 优化变量 C语言中使用 const 定义常量. 例如: const INT a = 10; 此处如果添加a = 20;,编辑器则会报错,因为此处 a ...

  7. C语言学习 第四次作业总结

    本次作业主要为了复习分支语句,同时复习之前学习过的判断语句,printf和scanf函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...

  8. 【GO】GO语言学习笔记四

    流程控制 1.条件语句 举个栗子: if x>5 { return 1; }else{ return 0; } 注意:  条件语句不需要使用括号将条件包含起来(); 无论语句体内有几条语句, ...

  9. GO语言学习(四)GO语言语言结构

    Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello ...

随机推荐

  1. PAT 1004. Counting Leaves (30)

    A family hierarchy is usually presented by a pedigree tree.  Your job is to count those family membe ...

  2. SQL 主键和外键约束

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外 ...

  3. [转]3proxy 二级代理配置样例

    转自:http://www.cnblogs.com/airsong23/p/3893094.html 适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, ...

  4. freemarke之TemplateDirectiveModel详解

    http://hougbin.iteye.com/blog/1457924 TemplateDirectiveModel接口是freemarker自定标签或者自定义指令的核心处理接口.通过实现该接口, ...

  5. 英文Ubantu系统安装中文输入法

    以前都是安装的中文Ubantu,但是有时候用命令行的时候中文识别不好,会出现错误,所以这次安装了英文版,但是安装后发现输入法不好用,于是就要自己安装输入法. 安装环境为Ubantu13.04 1.卸载 ...

  6. oracle6

    转换函数  介绍 转换函数用于将数据类型从一种转为另外一种.在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型 比如: crea ...

  7. 2016 11 9遇到问题 http请求的各种方式

    遇到问题:对接网易七鱼 调用他们接口是出现问题 1.对方要求  除上传文件外,其他所有接口请求Content-Type类型为:application/json;charset=utf-8:请求内容需要 ...

  8. Java基础知识强化之集合框架笔记49:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)按照总分从高到低输出到控制台

    1. 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)按照总分从高到低输出到控制台: 分析: A: 定义学生类    B: 创建一个TreeSet集合       C: 总分从高到底如何实现 ...

  9. Java实现直接插入查找

    import java.util.Scanner; /*算法思想:每趟将一个待排序的元素作为关键字,按照关键字值大小插入到已排好序的那部分序列的适当位置上,直到插入完成,*/ /*平均时间复杂度O(n ...

  10. skynet网络库socket-server

    最近在读大神云风的开源服务器架构skynet,其中的网络库,云风已经单独开来,可以独立使用. 开源地址: https://github.com/cloudwu/socket-server 网络库已经封 ...