C语言实现打印缓冲区到日志文件

编码过程中,有时候需要把一段缓冲区内容打印出来供调试参考。

由于缓冲区中可能含有'\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语言实现打印缓冲区到日志文件

相关文章:

你感兴趣的文章:

标签云: