有时候程序总是会发生意想不到的情况,为了方便排查错误的情况,还是写日志比较方便。这里自己写了一个简单的函数,能实现基本的功能。

BOOL WriteLog(char * DataBuffer)

{
CString strTempPath;
::GetTempPath(MAX_PATH, strTempPath.GetBuffer(MAX_PATH));
CString strLogFile = strTempPath + L"Log.txt";
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwBytesWritten = ;
BOOL bErrorFlag = FALSE;
OVERLAPPED strOverlapped = {};
strOverlapped.Offset = 0xFFFFFFFF;
strOverlapped.OffsetHigh= 0xFFFFFFFF;
hFile = CreateFile(strLogFile, GENERIC_READ| GENERIC_WRITE, , NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile== INVALID_HANDLE_VALUE)
{
return false;
}
char TimeMessage[MAX_PATH] = { };
SYSTEMTIME st;
::GetLocalTime(&st);
char szTime[] = { };
sprintf_s(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
sprintf_s(TimeMessage, "%s: %s\n", szTime,DataBuffer);
DWORD dwBytesToWrite = (DWORD)strlen(TimeMessage);
bErrorFlag = WriteFile(hFile, TimeMessage, dwBytesToWrite, NULL, &strOverlapped);
if (bErrorFlag==FALSE)
{
return false;
}
CloseHandle(hFile);
return true;
}

这里用到CreateFile和WriteFile函数:

CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。 
  文件 
  pipes
  邮槽 
  通信资源 
  磁盘驱动器(仅适用于 windowsNT ) 
  控制台 
  文件夹(仅用于打开)

HANDLE CreateFile(
 LPCTSTR lpFileName,    // 指向文件名的指针 
 DWORD dwDesiredAccess,    // 访问模式(写 / 读) 
 DWORD dwShareMode,    // 共享模式 
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针 
 DWORD dwCreationDisposition,   // 如何创建 
 DWORD dwFlagsAndAttributes,   // 文件属性 
 HANDLE hTemplateFile    // 用于复制文件句柄 
);
BOOL WriteFile(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);

这里有一点需要说明的,要写让文件能追加改写,一定要定义一个 OVERLAPPED 结构体,并把offset,offsethigh设成0xFFFFFFFF,并把这个结构体的地址传给WriteFile的最后一个参数。不然每次都会重头写,

 OVERLAPPED strOverlapped = {};
 strOverlapped.Offset = 0xFFFFFFFF;
 strOverlapped.OffsetHigh= 0xFFFFFFFF;
 bErrorFlag = WriteFile(hFile, TimeMessage, dwBytesToWrite, NULL, &strOverlapped);

这里有一个获得time的函数,也值得关注。

 SYSTEMTIME st;
 ::GetLocalTime(&st);
 char szTime[26] = { 0 };
 sprintf_s(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds)

最后的结果类似这样的:

一个简单的日志函数C++的更多相关文章

  1. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

  2. python定义的一个简单的shell函数的代码

    把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...

  3. setbuffer和freopen做一个简单的日志组件

    目标场景是这样的: 多线程的应用程序要频繁打一些小字节的日志,也不想引用很重的日志库. 设想了一个极其简单的日志组件,main线程中重定向stdout到文件,同时setbuffer设置一个10k的缓冲 ...

  4. 通过编写一个简单的日志类库来加深了解C#的文件访问控制

    在程序的开发调试过程及发布运行后的状态监控中,日志都有着极其重要的分量,通过在关键逻辑节点将关键数据记录到日志文件当中能帮助我们尽快找到程序问题所在.网上有不少专业成熟的日志组件可用,比如log4ne ...

  5. 代码调试--自定义一个简单的debug函数

    function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...

  6. 一个简单的JS函数,用于判断文本是否数字

    /****************************************************** 判断是否是数字(整数,小数均可,不包括负数)* 2014年10月10日22:38:19* ...

  7. Sql CLR创建一个简单的表值函数

    1.创建面目: 2. 添加函数代码: using System; using System.Data.Sql; using Microsoft.SqlServer.Server; using Syst ...

  8. [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO

    最近用nRF51822写了个天马4线SPI的1.77寸LCD彩屏驱动,效果如下: 屏幕的规格资料为:http://pan.baidu.com/s/1gdfkr5L 屏幕的驱动资料为:http://pa ...

  9. GNU Make 学习系列一:怎样写一个简单的Makefile

    编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...

随机推荐

  1. Java Try-with-resources

    目录 资源管理与 Try-Catch-Finally,旧风格 Try-with-resources 管理多个资源 自定义 AutoClosable 实现 Try-with-resources 是 ja ...

  2. ELK logstash 处理MySQL慢查询日志

    在生产环境下,logstash 经常会遇到处理多种格式的日志,不同的日志格式,解析方法不同.下面来说说logstash处理多行日志的例子,对MySQL慢查询日志进行分析,这个经常遇到过,网络上疑问也很 ...

  3. (转)pythonC3线性算法

    本文转自:http://kaiyuan.me/2016/04/27/C3_linearization/ 作者:Kaiyuan 注意:本文仅仅作为个人mark,所以排版并不如原文,另本文在原文基础上做了 ...

  4. 关闭ubuntu dash 方法

    因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell, ...

  5. Hadoop基础--统计商家id的标签数案例分析

    Hadoop基础--统计商家id的标签数案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出商家id的评论标 ...

  6. SpringMvc数据校验@Valid等注解的使用与工具类抽取

    最近在重构老项目的代码,发现校验入参占用了很多代码,之前我对这一块的认识局限于使用StringUtils等工具来多个if块进行判断,代码是没什么问题,但是总写这些令人生烦,毕竟写代码也要讲究优雅的嘛, ...

  7. 一些js的小技巧

    这里收集了一些编码上的小技巧,大家可以学习学习. 1.浮点转整型 使用|0快速转换 var a=(12.002)|0;//12 使用~~快速转换 ~取反运算符,2=0010,~2=1101,因为第一位 ...

  8. HTTP Methods

    简介 HTTP 定义了一组请求方法,以表明要对给定资源执行的操作.指示针对给定资源要执行的期望动作, 虽然他们也可以是名词,但这些请求方法有时被称为HTTP动词.每一个请求方法都实现了不同的语义,但一 ...

  9. git 修改已提交的注释

    在git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息 修改最后一次提交注释 git commit --amend 然后在出来的编辑界面,直接编辑注释的信息,保存退出 gi ...

  10. linux 串口驱动(三) 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3495825.html 三.串口的打开在用户空间执行open操作的时候,就会执行uart_ops->o ...