c++日志打印

c++通过CFile打印日志:
void writeLog(const char* LogFormat,...){
try{
char buf[10000] = {0};
_snprintf(buf , sizeof(buf) , "%d_%d_%s" , 200 , 100, "ffff");
char LogStr[3072]  ={0};
char sBuffer[2048] = {0};
va_list ap;
va_start(ap , LogFormat);
_vsnprintf(sBuffer ,sizeof(sBuffer)-1 , LogFormat , ap);
va_end(ap);
int nlen = _snprintf(LogStr , sizeof(LogStr)-1 ,  "%d_%d_%s=%s" , 900 , 100, "ccc" ,sBuffer);
CFile fLog;
//fLog.Open("C:\\Users\\Administrator\\Desktop\\JM122372075R90250000000.doc",CFile::modeNoTruncate | CFile::modeCreate | CFile::modeRead);//打开文件
if(fLog.Open(buf , CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)){
fLog.SeekToEnd();
fLog.Write(LogStr , nlen);
fLog.Close();
}else
{
}
   
}catch(...){


cout<<"aaaaaaaa"<<endl;
}
}

注解:1.(fLog.Open(buf , CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)创建一个以“buf”命名的日志文件,默认路径是项目的根目录可以用notdpad打开


2.代码中va_list,va_start,va_arg,va_end等函数是C/C++中用来解决变参问题时候的方法。
(1)va_list 
定义了一个指针arg_ptr, 用于指示可选的参数.
(2)va_start(arg_ptr, argN)
使 参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.
(3)va_arg(arg_ptr, type)
返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.
(4)va_end(arg_ptr)

清空参数列表, 并置参数指针arg_ptr无效.


3.    file_.Open("C:\\Users\\Administrator\\Desktop\\JM122372075R90250000000.doc",CFile::modeRead /*| CFile::modeCreate | CFile::modeNoTruncate*/);//加注释这两个参数说明下多参数的使用方式 
//打开文件方法
//第一个参数 文件路径 ,如果是串口输入COM1(COM后面加上串口号)
//第二个参数 文件操作模式 列举常用的几种模式:
CFile::modeCreate 文件以创建形式打开(创建一个新的文件,老文件数据将会丢失 ,可以配合CFile::modeNoTruncate 一起使用,不会覆盖老文件)
CFile::modeRead  采用读取方式打开文件
CFile::modeWrite 采用写入方式打开文件
CFile::modeReadWrite 采用读写方式打开文件
CFile::modeNoTruncate 采用不截断形式打开文件(与CFile::modeCreate配合使用在文件存在的情况下不会创建新的文件, 与CFile::modeWrite配合使用在文件有数据的情况下写入数据不会清空文件数据(会存在数据覆盖现象,下面会讲文件写入位置设置方法))
CFile::modeNoInherit 防止这个将要被打开的文件来源于子进程(实际几乎用不到)
CFile::typeBinary 文件数据将会以二进制的形式显示

CFile::shareDenyNone 采用共享形式打开文件(这个文件在不做读写的情况下打开)


CFile常用的函数:GetLength()函数:获取文件的当前总长度(读或写文件时可以随时调用函数查看文件的长度)方法
Read()函数:file_.Read(GetStr,4096);//这里读了4096个字节
Write()函数:file_.Write(GetStr,6);//这里写了6个字节
Seek()函数:file_.Seek(6,CFile::begin);//数据位置从文件开始向后移动6个字节
file_.Seek(6,CFile::current);//数据位置从当前位置向后移动6个字节
file_.Seek(-6,CFile::end);//数据位置从文件末端向前移动6个字节

版权声明:本文为u014206831原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。