宏定义
//预编译指令
#define NUM 10
这里我们在.c在遇到的NUM直接用它后面的内容替换
#include <stdio.h>
#define NUM 2 + 3
int main()
{
printf("%d\n",NUM*2)//8
//等价于2+3*2
return 0;
}
宏是直接替换内容NUM*2 ==>2 + 3 * 2
宏函数
#include<stdio.h>
#define MAX(a,b) if(a>b){printf("%d",a);}else{printf("%d",b);}
int main()
{
MAX(10,20)
return 0;
}
- 宏函数必须写在一行
- 如果想写多行要用 \ 进行连接,但函数名,关键字不要用\连接
- 主函数中调用宏函数后没有分号
- 如果不知道自己写的对否,直接把宏函数copy到调用宏函数的位置,试一下。
枚举
定义:enum 枚举类型 {枚举值列表};
#include <stdio.h>
enum Enum
{
SUN,
MON,
TUE,
WES,
THR,
FRI,
SAT,
};
int main()
{
int week = SUN;
week = MON;
printf("%d %d",week,MON);//5 5
return 0;
}
- 如果MON = 2,则后面的枚举数依次加一,也就是SAT = 7,但SUN = 0
- 如果MON = 10,则后面的枚举数依次加一,也就是SAT = 15,但SUN = 0
- 如果SUN = 7,MON = 3,那么后面的数同样依次加一,也就是SAT = 8、
多文件编程
- 多个.c文件的话就要包含头文件,库函数我们一般用<>,我们自己写的.h文件要用""表示
- 例#include <stdio.h>编译时直接在软件设置的指定路径中寻找里面是否有stdio.h的库文件
- #include "a.h"编译时先寻找你正在编辑的源代码文件所在的文件夹里面有没有a.h的库文件
变量和头文件的重复定义
a.h:
int max();
struct student {
char name[10];
int num;
};
b.h:
#include "a.h"
c.h:
#include "a.h"
main.c:
#include "b.h"
#include "c.h"
- 上面的结构体和函数都出现了两次,重复包含指的是在不同头文件中包含了相同变量或函数
//以sample.h为例
#ifndef _SAMPLE_H_
#define _SAMPLE_H_
//文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,
#include<stdio.h>//其他头文件
//结构体宏定义等
//函数声明
#endif
文件操作
C语言中的文件操作,一般会用到fopen、fread、fwrite、fgets、fputs、fclose这几个函数
文件打开方式
打开文件 | 说明 |
---|---|
r | 以只读的方式打开文件,该文件必须存在 |
r+ | 以读/写的方式打开文件,该文件必须存在 |
rb+ | 以读/写的方式打开一个二进制文件,只允许读/写数据 |
rt+ | 以读/写的方式打开一个文本文件,允许读和写 |
w | 打开只写文件,若文件存在则文件长度清为0,即文件内容消失,若不存在则创建该文件 |
w+ | 打开可读/写文件,若文件存在则文件长度清为0,即文件内容消失,若不存在则创建该文件 |
a | 以附加的方式打开只写文件,若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留) |
a+ | 以附加的方式打开可读/写文件,若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留) |
wb | 以只写的方式打开或新建一个二进制文件,只允许写数据 |
wb+ | 以读/写的方式打开或新建一个二进制文件,允许读和写数据 |
wt+ | 以读/写的方式打开或新建一个文本文件,允许读和写数据 |
at+ | 以读/写的方式打开一个文本文件,允许读或在文件末尾追加数据 |
ab+ | 以读/写的方式打开一个二进制文件,允许读或在文件末尾追加数据 |
fopen
语法和参数说明:
FILE *fopen(const char *filename, const char *mode);
filename : 要打开的文件名字符串
mode : 访问文件方式,详情看上面的文件打开方式
返回值
- 成功:返回新打开文件的文件指针
- 失败:返回NULL
fread
语法和参数说明:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer : 将文件中的二进制数据读取到该缓冲区中
size : 读取的基本单元字节大小,单位是字节,一般是buffer缓冲的单位大小
count : 读取的基本单元个数
stream : 文件指针
返回值
- 成功:实际从文件中读取的基本单元 个数 ; 读取的字节数是 基本单元数 * 基本单元字节大小
- 失败或读到文件末尾:返回0
fwrite
语法和参数说明:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr : 指针指向要写出数据的内存首地址
size : 要写出数据的基本单元的字节大小,写出单位的大小
nmemb : 要写出数据的基本单元的个数
stream : 文件指针
返回值
- 成功:实际写出到文件的基本单元个数;
- 失败或文件末尾:一个短项计数(或零)
fgets
语法和参数说明:
char *fgets(char *s, int size, FILE *stream);
s : 存储字符串的位置
size : 存储字符串的最大个数
stream : 文件指针
返回值
- 成功:返回字符串
- 失败或文件结束:NULL
fputs
语法和参数说明:
int fputs(const char *str, FILE *stream)
str : 这是一个数组,包含了要写入的以空字符终止的字符序列。
stream : 文件指针
返回值
- 成功:非负值
- 失败:EOF
fclose
语法和参数说明:
int fclose(FILE * stream)
stream : 文件指针
返回值
- 成功:0
- 失败:EOF