C语言学习总结(四) 剩余内容
第六章、剩余内容
(预处理指令,宏定义,条件编译,文件操作)
预处理指令
简单的来说就是在程序编译之前需要做的事情

1.宏定义
概念:
是一个替换代码的预处理指令,可以在编译之前进行代码替换(宏展开,条件编译,文件包含).
当需要用一些重复性代码或简单的函数运算时,可以用宏定义.提高效率
用法:
开始替换: #define 被替换内容 替换成的内容
如:
#define ka1 6
表示从这行开始下面所有代码中的ka1 替换成6
结束替换:
#undef 被替换内容
如: #undef ka1 表示到一行, 宏定义失效
特点:
- 命名尽量以大写或小写k开头.便于区分.(规范)
- 被双引号的引起来的不会被替换
- 宏定义只会做代码替换,不会关注任何逻辑,容易出现优先级错误(加括号解决).
- 替换可以设置作用域.如果不设置,作用域则是这行代码出现到代码的最后一行.
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(文件名,操作方式);
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语言学习总结(四) 剩余内容的更多相关文章
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
- R语言学习 第四篇:函数和流程控制
变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
- C语言学习第四章
今天学习C语言循环结构,为什么要用循环呢?因为有时候我们对一堆的数字进行重复的处理的时候要重复的编写一些相同或者差不多的代码,让程序显得很臃肿,而且写着也麻烦,如果用循环来写的话能简化很多,出错的话也 ...
- Go语言学习笔记(四) [array、slice、map]
日期:2014年7月22日 一.array[数组] 1.定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内 ...
- Swift语言学习(四)字符串与Array等集合的使用
Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提 ...
- [C语言学习笔记四]变量与系统的交互
使用 const 创建常量和使用 volatie 优化变量 C语言中使用 const 定义常量. 例如: const INT a = 10; 此处如果添加a = 20;,编辑器则会报错,因为此处 a ...
- C语言学习 第四次作业总结
本次作业主要为了复习分支语句,同时复习之前学习过的判断语句,printf和scanf函数的使用. 学习到这里,同学们应该已经基本掌握了基本的数据类型,分支结构,循环结构,条件判断语句.应该可以利用这些 ...
- 【GO】GO语言学习笔记四
流程控制 1.条件语句 举个栗子: if x>5 { return 1; }else{ return 0; } 注意: 条件语句不需要使用括号将条件包含起来(); 无论语句体内有几条语句, ...
- GO语言学习(四)GO语言语言结构
Go Hello World 实例 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释 接下来让我们来看下简单的代码,该代码输出了"Hello ...
随机推荐
- mvc分层的原理
首先这是现在最基本的分层方式,结合了SSH架构.1.modle层就是对应的数据库表的实体类.2.Dao层是使用了hibernate连接数据库.操作数据库(增删改查).3.Service层:引用对应的D ...
- iOS性能优化中的离屏渲染
GPU屏幕渲染有以下两种方式: On-Screen Rendering意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. Off-Screen Rendering意为离屏渲染 ...
- SVN/GIT源代码泄露
造成SVN源代码漏洞的主要原因是管理员操作不规范.在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息.但一些网站管理员在发布代码时,不愿意使用‘导出’功能 ...
- iOS网络层架构设计分享
前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...
- nginx同时监听本机ipv4/ipv6端口
修改nginx.conf配置文件 server { listen ; listen [::]:; } 0.0.0.0 表示本机所有ipv4地址,需要监听特定地址替换即可 [::] 表示本机所有ip ...
- 通过扫描包路径获取包内class
public static Set<Class<?>> getClasses(ClassLoader classLoader, String pack) { Set<Cl ...
- 安卓Intent(显式)
1.Intent是Android程序中各组件之间交互的重要方式,一般可用于启动活动.启动服务.以及发送广播等场景,这里先对活动进行说明Intent的一些作用. 2.Intent的用法大致可分为,显式I ...
- NLog 安装使用
1:安装 Install-Package NLog.Config 或 通过Nuget 2:Log levels Trace 非常详细的信息,一般在开发时使用. Debug 比Trace稍微少一点一般不 ...
- Scoket简介
我们很多人都听说过Socket编程也称网络编程,在我们当今的社会中网络已经深入到我们的生活中了,计算机的网络通信也成为我们生活中必不可少的一部分.而实现我们网络通信就得依靠网络编程,让我们的计算机之间 ...
- Android 读取txt文件并以utf-8格式转换成字符串
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 使用EncodingUtils 今天用到了城市选择三级联动的库,用的这个:https://gi ...