C语言中的__LINE__ 及__FILE__ 等预定义跟踪调试用法
1. C语言预定义跟踪调试宏介绍
C语言头文件 #include<stdio.h> 中定义了__FILE__、LINE、FUNCTION、__DATE__等跟踪调试宏定义,方便调试编译使用。
预定义宏的名称由两个下划线字符 " _ " 开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。
如果编译器不是标准的,则可能仅支持几个宏或根本不支持,编译程序也许还提供其它预定义的宏名。

#include <stdio.h>
// 打印文件所在的绝对位置
void Find_file() {
printf("This project is in \"%s\" \n\n", __FILE__);
}
// 打印出程序所在行数
void Print_line() {
printf("This print is on line %d\n\n", __LINE__);
}
// 打印出函数运行错误及位置
void test(int num) {
if (num < 0) {
printf("The [ %s() ] input is less than 0 on line %d.\n\n", __FUNCTION__, __LINE__);
}
else if (num == 0) {
printf("The [ %s() ] input is 0 on line %d.\n\n", __func__, __LINE__);
}
else {
printf("The [ %s() ] input is valid\n\n", __FUNCTION__);
}
}
int main()
{
printf("Programer run start from [%s] on line %d .\n\n", __FUNCTION__, __LINE__);
Find_file();
Print_line();
test( -10 );
test( 0 );
test( 1 );
return 0;
}
运行结果如下:

还可以把它打印到文件中去
#include<stdio.h>
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int del(int a,int b)
{
return a/b;
}
int main()
{
FILE *fp = fopen("./1.log","w+");
if(fp == NULL)
{
perror("fopen");
}
int a = 10,b = 20;
int ret = add(a,b);
fprintf(fp,"%d %d\n",__LINE__,ret);//行数
int ret1 = sub(a,b);
fprintf(fp,"%s %d\n",__FILE__,ret1);//文件路径
int ret2 = mul(a,b);
fprintf(fp,"%s %d\n",__DATE__,ret2);//创建文件日期(月,日,年)
int ret3 = del(a,b);
fprintf(fp,"%s %d\n",__TIME__,ret3);//创建文件的时间
return 0;
}
文件的一些练习
1.实现文件的简单加密和解密
#include <stdio.h>
#include <string.h>
void encode(char *name, char *newName, int code);
void decode(char *name, char *newName, int code);
int main()
{
encode("main.c", "encode.c", 666);
decode("encode.c", "decode.c", 666);
return 0;
}
/**
* @brief encode 加密文件
* @param name 需要加密的文件名称
* @param newName 加密之后的文件名称
* @param code 秘钥
*/
void encode(char *name, char *newName, int code){
FILE *fw = fopen(newName, "w+");
FILE *fr = fopen(name, "r+");
char ch = EOF;
while((ch = fgetc(fr)) && (!feof(fr))){
fputc(ch ^ code, fw);
}
fclose(fw);
fclose(fr);
}
/**
* @brief encode 解密文件
* @param name 需要解密的文件名称
* @param newName 解密之后的文件名称
* @param code 秘钥
*/
void decode(char *name, char *newName, int code){
FILE *fw = fopen(newName, "w+");
FILE *fr = fopen(name, "r+");
char ch = EOF;
while((ch = fgetc(fr)) && (!feof(fr))){
fputc(ch ^ code, fw);
}
fclose(fw);
fclose(fr);
}
2.俩种方法通过文件操作读取图片然后把图片写到另一个文件中
#include<stdio.h>
int main()
{
FILE *fp = fopen("./1.jpg","rb");
if(fp == NULL)
{
perror("fopen");
}
FILE *fq = fopen("./2.jpg","wb");
if(fq == NULL)
{
perror("fopen");
}
char str[1000];
char ch;
rewind(fp);
while(1)
{
if(feof(fp)!=0)
{
break;
}
ch = fgetc(fp);
fputc(ch,fq);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp = fopen("./1.jpg","rb");
if(fp == NULL)
{
perror("fopen");
}
FILE *fq = fopen("./3.jpg","wb");
if(fq == NULL)
{
perror("fopen");
}
fseek(fp,0,2);
int i = ftell(fp);
rewind(fp);
char *p = (char *)malloc(i);
fread(p,1,i,fp);
fwrite(p,1,i,fq);
fclose(fp);
fclose(fq);
free(p);
p=NULL;
return 0;
}
1.有5个学生, 每个学生有3门课程的成绩,从键盘输人学生数据(包括学号,姓名,3
门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。
2.将第1题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据
存入一个新文件“stu. sort" 中。
3.将第2题已排序的学生成绩文件进行插人处理。插人一个学生的3门课程成缋,程
序先计算新插人学生的平均成绩,然后将它按成绩高低顺序插人,插人后建立一个新文件。
4.将第3题结果仍存入原有的“stu_ sort"文件而不另建立新文件。
struct student//定义结构体
{
int num;
char name[10];
int score[3];
float ave;
}stu[5];
int main(int argc, char *argv[]) {
int i,j,sum,t;
FILE *fp;
struct student p,temp,re[6];
for(i=0;i<5;i++)//结构体赋值
{
printf("输入第%d条记录\n",i+1);
scanf("%d,%s",&stu[i].num,stu[i].name);
printf("请输入三门课成绩\n");
scanf("%d,%d,%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
sum=0;
sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].ave=sum/3.0;
}
if((fp=fopen("stud.txt","w"))==NULL)//写入文件
{
printf("cannot open stud.txt\n");
exit(0);
}
for(i=0;i<5;i++)
fwrite(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
if((fp=fopen("stud.txt","r"))==NULL)//读取文件
{
printf("cannot open stud.txt\n");
exit(0);
}
for(i=0;i<5;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
printf("\n");}
好了,今天就分享到这了,明天继续!

本文介绍C语言中用于调试的预定义宏,如__FILE__和__LINE__的使用方法,并通过示例展示了如何利用这些宏进行调试,同时提供了文件操作的基本应用。
107

被折叠的 条评论
为什么被折叠?



