预处理和文件操作

编译顺序:

1.将注释替换为 空行/#处理预处理语句

gcc  -o hello.i  -E hello.c
llvm-gcc(底层虚拟gcc)
#号开始的预处理语句只给编译器看,不占用运行时间

#include “ < > ":  
 将.h文件拷贝赋值到当前文件
< >——>从 /usr/include/ 里面找
“ “——>从 当前目录 找,找不到 再到usr/include/ 里面找

#define(宏常量):    ——文本替换  不占运行时空间,只占编译时空间
宏定义是有作用域的
设置宏变量 ,没有参数,不能有空格  

无参宏:
#define PI 3.1415926
宏在双引号中不被替换

有参宏:

#define PI(a) 2.1415926+a

宏不能递归定义,可以迭代定义(迭代在扫描时发生)

error  : #define p9 p9+1

success:

 #define p8 3.14

 #define p9 p8+1

带参宏需要加一层小括号,避免优先级问题错误



2.条件编译

#if defined DEBUG

  语句1

#else

  语句2

#endif

传参定义宏

--DDEBUG


3.宏的运算

#:  字符串化

##: 字符串连接

#define STR(a) #a

#define STRCAT(a,b) STR(a) a##b


4.测试宏是编译器支持的,无需程序员显示定义的宏,预先定义的宏
__FILE__    //获取文件名(test.c)
__DATE__ //获取当前日期
__TIME__ //获取当前时间
__LINE__ //获取当前行号
__func__ //第一步预处理时不替换,第二部编译时才替换


************************************文件操作*****************************************

#include <stdio.h>

//fopen打开文件//缓冲区//读缓冲写缓冲,是由操作系统为当前运行的程序自动分配得,有大小限制

FILE* fp = NULL;    //文件结构体指针(宏定义),文件指针

fp = fopen("/Users/qianfeng/macro/data.txt","r+”);


r  ——只读不写,当文件不存在时报错
r+  ———当文件不存在时报错,可写可读文件
w+ --------当文件不存在是创建文件,当存在时 清空文件内容
a+   ----------当文件不存在是创建,当存在时 不会清空文件内容

perror("data1.txt”);  //报错,带有系统错误提示

rewind(fp);   //将文件读写光标回置到最前面

fseek();文件回置   SEEK_SET  SEEK_CUR   SEEK_END

fseek(fp, 5L, SEEK_SET);

EOF == -1  只存在于文件结尾



scanf每次从输入缓冲区中取数据,根据指定的类型取数据,

不符合指定类型的数据依然存在于缓冲区中,缓冲区中默认都是字符

scanf遇到空格或者换行就表示输入结束

char buffer[512];

fgets  ---只能用户输入字符串,操作文件时遇到空格不会结束,遇到换行结束

fgets(buffer, 12, stdin);

fputs    -----写入数据

fputs(buffer+5,fp);    指针偏移5个字符将后面的内容追加到fp文件里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值