我们写程序,不可能一次就写的一个bug都没有,必须要不停地修改,有可能自己调试已经没有问题了,发给客户后还是问题很多,这个时候跑到客户处解决问题就不现实了,自己不在还要找到问题的所在,最好的办法就是记录一下程序运行的日志了,只需要跟客户要下日志文件,自己就能定位错误的大概地方了,好提供更改的数据支持。好了,不说废话了,直接上代码:
#include<stdio.h>int main()
{FILE* pf = fopen("log.txt", "a+");if (pf == NULL){perror("打开文件失败!");return 1;}int i = 0;for (i = 0; i < 1000; i++){// 向日志文件中写入文件名,程序当前行号,当前日期,当前时间, 当前函数名和 变量i的值fprintf(pf, "文件名:%s 行号:%d 日期:%s 时间:%s 函数名:%s i:%d \n", __FILE__, __LINE__, __DATE__, __TIME__, __FUNCTION__, i);}fclose(pf);pf = NULL;return 0;
}
下面是程序运行完后日志文件的截图:
#
#define 现在的变量名 要替换的变量名
用define可以把一些特别长的名称改成特别短且好记好写的名称。
#include<stdio.h>#define CASE break;case
#define RZ printf("文件名:%s 行号:%d 日期:%s 时间:%s 函数名:%s i:%d \n", __FILE__, __LINE__, __DATE__, __TIME__, __FUNCTION__, i);int main()
{int i = 0;RZ //此处就会打印日志信息,上面difine所代替的那些代码switch (i){case 1:CASE 2: // 这里要用break;case代替,这样语法就正确了。
/*break;case 2:
*/CASE 3:}
}
#号的使用,在define中使用#号是替换当前值所代表的字符串,不用#号是当前字符串的值。
#include<stdio.h>#define print(x) printf(" 当前 "#x" 的值是:%d \n",x)int main()
{int a = 10;print(a);int b = 20;print(b);int c = 30;print(c);return 0;
}
上面每次打印的都是整型,如果打印一个小数时这个方法就又不适用了,可以改成下面的设计:
#include<stdio.h>#define print(x) printf(" 当前 "#x" 的值是:%d \n",x)
#define print(x, format) printf(" 当前 "#x" 的值是:" format" \n",x) //把其中的%d 替换了int main()
{int a = 10;print(a, "%d");int b = 20;print(b, "%d");int c = 30;print(c, "%d");//如果打印小数的话原来的%d就不适用了,需要换成%ffloat d = 3.14;print(d, "%f");return 0;
}
##合并标识符,组成一个新的标识符
#include<stdio.h>#define HEBING(x,y,z) x##y##z // 把xyz三个标识符合并成一个新的标识符int main()
{int retab = 99;printf("%d", HEBING(ret, a, b));
}