宏定义
在一个语句中引用另外一个语句中已经定义的符号,是完全合法的。
#define PI 3.141592675
#define TWO_PI 2.0*PI
注意:如果宏定义语句需要跨两行,那么我们必须在第一行的结尾处放置一个反斜线\
带有参数的宏定义语句#define IS_LEAP_YEAR(y) y%4==0&&y%100!=0|y%400==0
W:c语言的预处理器仅仅进行文本替换
W:定义带有参数的符号时,符号名称和参数列表的左括号之间不允许有空格。
W:与函数不同的是,我们不需要声明参数y的类型。
接受可变参数个数的宏
#define debugPrintf(...) printf("Debug:""__VA_ARGS__");
#参数
#define str(x) #x
str(testing)
"testing"
w:如果在宏定义的参数前面放置一个#,那么c语言的预处理器将使用该参数生成一个常数字符串。
w:如果参数内部本身还包含双引号或者反斜线,这些特殊符号在宏展开的过程中都将保留
##操作符
#define printx(n) printf("%i\n",x##n)
printx(20)
printf("%i\n",x20);
w:宏定义中使用这个操作符可以将两个符号连接起来,操作符前面或者后面可以是宏的参数,创建一个新的符号。
#include语句
头文件或者包含文件里面集中了很多程序中都需要使用的宏定义,可以用#include语句,将其包含到程序中。
<>尖括号让c语言预处理器到某些特定的系统目录寻找该文件。
系统头文件
c语言系统本身就提供了很多的标准头文件
IO重定向
reverse>data
将reverse程序的输出写入到data文件里面
reverse<num
将reverse的输入定向到num文件
reverse<num>data
将文件num输入到reverse程序中,处理后输入到data文件
文件结束标志
在c语言中,我们读完了文件中的数据,系统将设置一个文件结束标志。这个特殊的值用符号EOF代表,该符号在系统头文件<stdio.h>中定义。
fopen函数
fopen函数接受两个参数,第一个参数是字符串类型,用于表示将要打开文件的文件名,第二个参数还是字符串,用于表示用何种模式打开文件。
如果打开失败,该函数返回NULL,NULL在系统头文件<stdio.h>中定义,该文件还定义了一个结构类型FILE,我们必须使用一个指向该类型的指针变量来存储fopen函数的返回值。
FILE*inputFile;
inputFile=fopen("data","r");
有三种模式,‘w’写模式,‘r’读模式,‘a’追加模式。
getc函数和putc函数
getc函数与getchar函数相同,读入一个字符,但是可以接受一个FILE类型的指针参数,表示从哪个文件读取数据。
putc函数与putchar相同,但是要接受两个参数,1,需要输出的字符,第二,FILE指针。
fcolse函数接收一个参数,即需要关闭文件的 FILE指针。
fgets函数和fputs函数
如果需要从文件中读取整行数据,我们可以使用c语言提供的fgets和fputs函数。
fgets(buffer,n,filePtr)
其中,buffer是一个字符数组,用于保存读入的字符,n代表buffer最大能够容纳的字符个数,filePtr是需要从中读取数据的文件指针。
fputs(buffer,filePtr);
fputs函数将buffer中的字符输出到filePtr对应的文件中,一直到遇到buffer中的空字符为止。