编码过程中,有时候需要把一段缓冲区内容打印出来供调试参考。
由于缓冲区中可能含有'\0'
,而printf
, fprintf
等函数打印时遇到'\0'
即止,所以打印结果很可能不完整。
于是就把很多年前写好的一个buff_dump
函数翻了出来,贴个代码在此,方便用时来取。
#include <stdio.h>#define LOGPATH "."#define LOGFILE "buff_dump.log"/*********************************************************** * * 函数名 : buff_dump * 功 能 : 将缓冲区内容记录到日志文件 * 参 数 : I char *buf 缓冲区指针 * I int len 缓冲区长度 * 返回值 : 无 ************************************************************/void buff_dump(char *buf, int len){ int line = 0; int begin = 0; FILE *fp = NULL; register int i = 0; register int j = 0; unsigned char ch = 0; char *fopentype = "a+"; char cmd[200]; char filename[200]; memset(cmd, 0x00, sizeof(cmd)); memset(filename, 0x00, sizeof(filename)); sprintf(filename, "%s/%s", LOGPATH, LOGFILE); fp = fopen(filename, fopentype); if ( NULL == fp ) { memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "mkdir -p %s", LOGPATH); system(cmd); fp = fopen(filename, fopentype); if ( NULL == fp ) { printf("打开日志文件[%s]错!\n", filename); return; } } fprintf(fp, "\n-----------------------Dump Begin ! Len = [%08d]--------------------------", len); fprintf(fp, "\nDisplacement 01-02-03-04-05-06- Hex Value -11-12-13-14-15-16 --ASCII Value--" ); for ( line = 0; line*16 < len; line++ ) { begin = line * 16; fprintf(fp, "\n%05d(%05x)", begin, begin); for ( i = 0; i < 16; i++ ) { if ( begin+i < len ) { fprintf(fp, " %02x", (unsigned char)(buf[begin+i])); } else { fprintf(fp, " "); } } fprintf(fp, " "); for ( j = 0; j<16 && begin+j<len; j++ ) { ch = buf[begin+j]; if ( !ch ) { ch = '.'; } else if ( !( isalnum(ch) || ispunct(ch) || (ch>0x80) ) ) { ch = ' '; } fprintf(fp, "%c", ch); } } fprintf(fp, "\n-----------------------Dump End ! Len = [%08d]--------------------------\n\n", len); fflush(fp); fclose(fp); return;}
调用实例:
int main(int argc, char *argv[]){ char *tmpstr = "1234567890abasdelkads随便啦DDLP*()$E__1"; buff_dump(tmpstr, strlen(tmpstr)); return 0;}
运行结果:
-----------------------Dump Begin ! Len = [00000039]--------------------------Displacement 01-02-03-04-05-06- Hex Value -11-12-13-14-15-16 --ASCII Value--(00000) 31 32 33 34 35 36 37 38 39 30 61 62 61 73 64 65 1234567890abasde(00010) 6c 6b 61 64 73 cb e6 b1 e3 c0 b2 44 44 4c 50 2a lkads随便啦DDLP*(00020) 28 29 24 45 5f 5f 31 ()$E__1-----------------------Dump End ! Len = [00000039]--------------------------
原文地址:C语言实现打印缓冲区到日志文件, 感谢原作者分享。 飞机一阵抖动,我终于说出了最后一句再见。