包含三个主要的文件:joefunction.h(c), m.c(主函数文件)

1. m.c

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "joefunction.h"extern FILE *g_logFile;int main(int argc, char *argv[])
{char temp[16] = {0}, fname[20] = {0};getTime(temp, TIME_FORMAT_FILENAME);sprintf(fname, "%s.log", temp);g_logFile = openFile(fname, "a+");if(g_logFile){int i;for(i = 1; i <= 20; i++)writeLog("%s()-%dL: CC-[%s%d]", __FILE__, __LINE__, "Hello world", i);fclose(g_logFile);}return 0;
}

2. joefunction.h

// Author:       Joe Black
// Time:        2011-4-5
// Note:        This is a shared file which contains the most useful functions.#include <stdio.h>#define MAX_BUFSIZE 250enum
{TIME_FORMAT_DATETIME,TIME_FORMAT_TIME,TIME_FORMAT_DATE,TIME_FORMAT_FILENAME
};// 路径相关
int getCurFilePath(char *lpOut);                // get full path of the executable file
int getCurDir(char *lpOutDir);                  // get directory-path of current executable-file// 时间相关
int getTime(char *out, int fmt);                // 获取当前系统时间// 文件操作
void writeLog(char *fmt, ...);                  // 写日志信息到文件
FILE* openFile(const char *fileName, const char *mode); // 打开文本文件
int writeFile(FILE *fp, const char *str, int bLog);     // 写字符串到文件,bLog表明是否为日志文件
int closeFile(FILE *fp);

3. joefunction.c

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdarg.h>
#include "joefunction.h"FILE *g_logFile = NULL;void writeLog(char *fmt, ...)             // write log infor to log file
{
#if defined(DEBUG) || defined(_DEBUG)       // output log infor when debugva_list args;static char logStr[MAX_BUFSIZE] = {0};  // store log stringva_start(args, fmt); vsprintf(logStr, fmt, args);            // format log infor to logStr[]va_end(args);writeFile(g_logFile, logStr, 1);        // write log string to log file
#endif
}#ifdef WIN32
#include <windows.h>
int getCurFilePath(char *lpOut)             // get full path of the executable file
{char chPath[MAX_BUFSIZE] = {0};int len = GetModuleFileName(NULL, chPath, MAX_BUFSIZE);if(len > 0){strcpy(lpOut, chPath);return 1;}return 0;
}int getCurDir(char *lpOutDir)              // get directory-path of current executable-file
{char chPath[MAX_BUFSIZE] = {0};char drive[4] = {0}, subdir[MAX_BUFSIZE] = {0}, fn[MAX_BUFSIZE] = {0}, ext[MAX_BUFSIZE] = {0};if(getCurFilePath(chPath) > 0){_splitpath(chPath, drive, subdir, fn, ext);sprintf(lpOutDir, "%s%s", drive, subdir);return 1;}return 0;
}
#else
int getCurFilePath(char *lpOut)             // get full path of the executable file
{char chPath[MAX_BUFSIZE] = {0};int len = readlink("/proc/self/exe", chPath, sizeof(chPath)); // get full path of the current-executable fileif(len >= 0){strcpy(lpOut, chPath);return 1;}return 0;
}int getCurDir(char *lpOutDir)              // get directory-path of current executable-file
{char chPath[MAX_BUFSIZE] = {0};if( getCurFilePath(chPath) > 0 ){dirname(chPath);                       // dirname will change value of "chPath"(contain result)strcpy(lpOutDir, chPath);             // copy result to out-paramreturn 1;}return 0;
}
#endif/*功能:      获取当前系统时间返回值: 0-成功,-1-失败out:       保存返回的系统时间,格式由fmt决定fmt:       0-返回:yyyy-mm-dd hh24:mi:ss, 1-返回:yyyy-mm-dd, 2-返回:hh24:mi:ss
*/
int getTime(char *out, int fmt)             // 获取当前系统时间
{time_t t;struct tm *tp;if(out == NULL)return -1;t = time(NULL);tp = localtime(&t);if(fmt == TIME_FORMAT_DATETIME)sprintf(out, "%02d/%02d/%02d %02d:%02d:%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);else if(fmt == TIME_FORMAT_DATE)sprintf(out, "%02d/%02d/%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday);else if(fmt == TIME_FORMAT_TIME)sprintf(out, "%02d:%02d:%02d", tp->tm_hour, tp->tm_min, tp->tm_sec);else if(fmt == TIME_FORMAT_FILENAME)sprintf(out, "%02d%02d%02d_%02d%02d%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);return 0;
}FILE* openFile(const char *fileName, const char *mode) // 打开文本文件
{FILE *fp = fopen(fileName, mode);return fp;
}/*功能:       将str写入到文件返回值:    写文件成功返回0,否则返回-1fp:      文件指针str:        待写入的字符串bLog:        1-是日志文件,0-不是日志文件说明:       如果是日志文件,将会在str前加上当前时间(格式如:2011-04-12 12:10:20)
*/
int writeFile(FILE *fp, const char *str, int bLog)          // 写字符串到文件,bLog表明是否为日志文件
{char curTime[MAX_BUFSIZE] = {0};int ret = -1;if(bLog) // 获取当前系统时间{getTime(curTime, 0);ret = fprintf(fp, "[%s] %s\n", curTime, str);}elseret = fprintf(fp, "%s\n", str);if(ret >= 0){fflush(fp);return 0;               // 写文件成功}elsereturn -1;
}int closeFile(FILE *fp)
{return fclose(fp);
}

C语言日志操作类实例相关推荐

  1. .net mysql操作类_ASP.NET数据库操作类实例

    本文实例讲述了ASP.NET数据库操作类.分享给大家供大家参考,具体如下: using System; using System.Data; using System.Configuration; u ...

  2. php加数据库开发案例,PHP简单数据库操作类实例【支持增删改查及链式操作】

    本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类 ...

  3. 使用Log4j进行日志操作(牛小浩)不错的

    使用Log4j进行日志操作   一.Log4j简介   (1)概述 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是 ...

  4. 使用Log4j进行日志操作

    使用Log4j进行日志操作 英文原文 内容: 1. 概述   1.1. 背景   1.2. Log4j简介 2.一个简单的例子   2.1. 不使用Log4j   2.2. 迁移到Log4j   2. ...

  5. php文件写入生成文件,PHP 文件操作类(创建文件并写入) 生成日志

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 PHP 文件操作类(创建文件并写入) 生成日志 /** * 文件操作(生成日志)支持多条插入 * (如果插入多条语句并换行 ...

  6. 易语言数据类型与c 对照,易语言利用自定义数据类型和数组. 制作键对值操作类/内存配置...

    易语言利用自定义数据类型和数组.  制作键对值操作类/内存配置.版本 2 .支持库 spec .子程序 _临时子程序 .局部变量 test, classKeyValue .局部变量 局_取值方法2,  ...

  7. php pdo 事物类,一个基于PDO的数据库操作类(新) 一个PDO事务实例

    /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录.多条记录,返回最 ...

  8. mysql db模块下载_易语言MySql数据库操作类V1.0模块源码

    易语言MySql数据库操作类V1.0模块源码 易语言MySql数据库操作类V1.0模块源码 系统结构:MySql数据库连接类_测试子程序,置连接选项,连接,关闭,是否已连接,取连接句柄,置连接句柄,执 ...

  9. java面向对象高级分层实例_数据库操作类

    package bdqn.studentSys.Dao.impl; /**** 学生表的数据库操作类*/ import java.sql.ResultSet; import java.sql.SQLE ...

最新文章

  1. informix中if else使用_面试官:代码中出现大量的if/else,需要优化,你有什么好方案?...
  2. JQuery系列(8) - JQuery插件开发
  3. error : flash system error_求求你,别再用 System.out.println 了!
  4. 基于SGIP协议编写短信网关接口
  5. codevs 1145 Hanoi双塔问题 2007年NOIP全国联赛普及组
  6. Doris之数据模型的选择建议
  7. Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found
  8. Java8之后,使用jdbc连接本地access数据库。DEMO
  9. Mysql数据库root密码管理四法
  10. 基于大佬的代码实现看板娘效果(三段代码实现)
  11. VS2013漂亮字体
  12. 2022最新简约好用的夏雨图床系统源码+UI超好看
  13. 报错:version magic ‘3.10.0_hifone SMP mod_unload ARMv7 p2v8 ‘ should be ‘3.10.0_s40 SMP mod_unload ARM
  14. 一个机器人,主要由哪几部分组成?
  15. google翻译的用法 使用translate.google.com翻译整个网页内容
  16. 全球10大B2B电子商务平台排行,这个网站只排第三!
  17. 爱情呼叫转移一部适合女人看的电影
  18. DBeaver连接(人大金仓/达梦)数据库 ,达梦、人大金仓数据库可视化工具
  19. iOS开发中自带的图标库
  20. weinre 真机调试

热门文章

  1. 一个封装了的选项卡效果js
  2. 强化学习应用于组合优化问题_如何将强化学习应用于现实生活中的计划问题
  3. rest laravel_如何通过测试驱动开发来构建Laravel REST API
  4. TensorFlow.js快速入门
  5. 已知两点坐标拾取怎么操作_已知的操作员学习-第3部分
  6. 实验人员考评指标_了解实验指标
  7. PCB genesis自制孔点 Font字体实现方法
  8. ASP.NET Core 源码学习之 Logging[3]:Logger
  9. Orcale用户管理
  10. 找到的程序集清单定义与程序集引用不匹配