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

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. E 定向 牛客练习赛25

    tarjan 父节点和子节点 #include <cstdio> #include <cstdlib> #include <cmath> #include < ...

  2. 织梦dedecms搜索页加上序列号autoindex

    在我们做织梦搜索页模板的时候经常会使用到autoindex标签.那么怎么才能实现搜索页可以使用呢?下面给大家分享下解决方法: 打开文件:include/arc.searchview.class.php ...

  3. css中实现ul两端的li对齐外面边缘

    其实就是设置ul的宽度大一些就好

  4. [机器学习&数据挖掘]朴素贝叶斯数学原理

    1.准备: (1)先验概率:根据以往经验和分析得到的概率,也就是通常的概率,在全概率公式中表现是“由因求果”的果 (2)后验概率:指在得到“结果”的信息后重新修正的概率,通常为条件概率(但条件概率不全 ...

  5. 第5月第13天 node cnpm安装 babel

    1. https://nodejs.org/en/download/ http://www.runoob.com/react/react-install.html 2. npm install --s ...

  6. linux下brctl配置网桥

    原文:http://zhumeng8337797.blog.163.com/blog/static/1007689142011643834429/ 先装好网卡,连上网线,这是废话,不用说了. 然后开始 ...

  7. Android 5.0 API

    Android 5.0 (LOLLIPOP) 为用户和应用开发者提供了新功能.本文旨在介绍其中最值得关注的新 API. 如果您有已发布的应用,请务必看一看 Android 5.0 行为变更,了解您的应 ...

  8. Android安全系列之:如何在native层保存关键信息

    相信大家在日常开发中都要安全层面的需求,最典型的莫过于加密.而apk是脆弱的,反编译拿到你的源码轻而易举,这时候我们就需要更保险的手段来保存密钥之类的关键信息.本文就细致地讲解简单却实用的native ...

  9. shell升级

    对/sbin/nologin的理解   系统账号的shell使用 /sbin/nologin ,此时无法登陆系统,即使给了密码也不行.   所谓“无法登陆”指的仅是这个用户无法使用bash或其他she ...

  10. TCxGrid 把列移上移下。

    T