一个简单的日志函数C++
有时候程序总是会发生意想不到的情况,为了方便排查错误的情况,还是写日志比较方便。这里自己写了一个简单的函数,能实现基本的功能。
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++的更多相关文章
- Linux下一个简单的日志系统的设计及其C代码实现
		
1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...
 - python定义的一个简单的shell函数的代码
		
把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...
 - setbuffer和freopen做一个简单的日志组件
		
目标场景是这样的: 多线程的应用程序要频繁打一些小字节的日志,也不想引用很重的日志库. 设想了一个极其简单的日志组件,main线程中重定向stdout到文件,同时setbuffer设置一个10k的缓冲 ...
 - 通过编写一个简单的日志类库来加深了解C#的文件访问控制
		
在程序的开发调试过程及发布运行后的状态监控中,日志都有着极其重要的分量,通过在关键逻辑节点将关键数据记录到日志文件当中能帮助我们尽快找到程序问题所在.网上有不少专业成熟的日志组件可用,比如log4ne ...
 - 代码调试--自定义一个简单的debug函数
		
function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...
 - 一个简单的JS函数,用于判断文本是否数字
		
/****************************************************** 判断是否是数字(整数,小数均可,不包括负数)* 2014年10月10日22:38:19* ...
 - Sql CLR创建一个简单的表值函数
		
1.创建面目: 2. 添加函数代码: using System; using System.Data.Sql; using Microsoft.SqlServer.Server; using Syst ...
 - [nRF51822]  1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
		
最近用nRF51822写了个天马4线SPI的1.77寸LCD彩屏驱动,效果如下: 屏幕的规格资料为:http://pan.baidu.com/s/1gdfkr5L 屏幕的驱动资料为:http://pa ...
 - GNU Make 学习系列一:怎样写一个简单的Makefile
		
编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确,程序员可能会浪费大量的时间去追踪问题.大多数的开发者都经历过这 ...
 
随机推荐
- Kubernetes 部署 1.9.7 高可用版
			
转载于https://codegreen.cn/2018/08/30/kubernetes-cluster-1.9.7/ 前言 在部署之前,首先感谢 手动搭建高可用的kubernetes 集群 博文的 ...
 - 使用 Nginx 和 Gunicorn 部署 Django 博客(转)
			
原文:http://zmrenwu.com/post/20/ http://www.siar.me/post/9/ 针对很多朋友反映按照教程的做法始终只能看到 Nginx 欢迎页面的问题,Tian ...
 - MingW-v4.8.0+EDE-v13.04 配置使用C语言图形库
			
From: http://www.cnblogs.com/killerlegend/p/3946768.html Author:KillerLegend Date:2014.8.30 MingW的配置 ...
 - bzoj千题计划296:bzoj1053: [HAOI2007]反素数ant
			
http://www.lydsy.com/JudgeOnline/problem.php?id=1053 求n以内约数个数最多的数 #include<cstdio> using names ...
 - (一)Git时间--初识版本控制工具
			
//配置一下你的身份 git config --global use.name "Douzi" git config --global use.email "jdouzi ...
 - 有关楼层滚动且对应楼层Nav导航高亮显示
			
$(document).ready(function(e) { //定义数组,储存楼层距离顶部的高度(floorsTop) var floorsTop=[]; function floorsTopF( ...
 - iOS手势UIGestureRecognizer的使用及手势冲突的解决办法【转】
			
转自:iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用 关于手势的一篇很好的帖子,转载过来免得丢失.你可能最感兴趣的是手势间的互斥处理,那么就搜索 4.手势间的互斥处 ...
 - WIN10文件无法自动刷新问题解决方法
			
Window10系统有时候会遇到以下类似的问题 1.文件删除后,图标还在,无法自动刷新屏幕,按F5或右键菜单刷新后才消失 2.文件粘贴后,不显示,刷新后才显示 3.回收站清理后,文件图标仍显示有垃圾 ...
 - casperjs批量执行多个url
			
var fs=require("fs"); ////-------sample.js-------// //casperオブジェクトを生成var casper = require( ...
 - ajax与302响应
			
在ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状态码吗?能够从Response Headers中得到Location的值进行重定向吗?让我们来一起看看实际 ...