1.c++获取windows系统时间的方法
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
char m_subject[256];
SYSTEMTIME curTime;
GetLocalTime(&curTime);
memset(m_subject,0,sizeof(m_subject));
sprintf(m_subject,"program crashed announcement time:%u-%u-%u %u:%u:%u",curTime.wYear,curTime.wMonth,
curTime.wDay,curTime.wHour,curTime.wMinute,curTime.wSecond);
printf("%s\n",m_subject);
return 0;
}
--------------
参考:
TCHAR szDate[500];
TCHAR sztTime[500];
// Date: <SP> <dd> <SP> <mon> <SP> <yy> <SP> <hh> ":" <mm> ":" <ss> <SP> <zone> <CRLF>
SYSTEMTIME st={0};
::GetSystemTime(&st);
::GetDateFormat(MAKELCID(0x0409,SORT_DEFAULT),0,&st,_T("ddd\',\' dd MMM yyyy"),szDate,sizeof(szDate));
::GetTimeFormat(MAKELCID(0x0409,SORT_DEFAULT),TIME_FORCE24HOURFORMAT,&st,_T("HH\':\'mm\':\'ss"),sztTime,sizeof(sztTime));
sprintf(header,"Date: %s %s\r\n", szDate, sztTime);
2.获取当前应用程序模块
#include <Windows.h>
#include <string>
using namespace std;
string GetAppPath()//GetAppPath()返回的是exe所在目录
{
char szPath[ MAX_PATH ]; // 获?取¨?应®|用®?程¨¬序¨°路¡¤径?
if(GetModuleFileNameA(NULL, szPath, MAX_PATH))//不?等̨¨于®¨²0表À¨ª示º?成¨¦功|
{
string AppPath(szPath);
int rindex = AppPath.rfind('\\');
AppPath = AppPath.substr(0,rindex);//从0开始,截取rindex个字符(即截止到’\’的前一个字符,不包含最后一个’\’!)
return AppPath;
}
return string("");
}
Debug模式下获取的文件:
D:\myPrograms\decodeBase64\Debug\decodeBase64.exe
对应的模块路径为:
D:\myPrograms\decodeBase64\Debug
Release模式下获取的模块文件:
D:\myPrograms\decodeBase64\Release\decodeBase64.exe
对应的模块路径为:
D:\myPrograms\decodeBase64\ Release
3.判断某个文件是否存在的方法:
- _access函数
- CreateFile函数
- FindFirstFile函数
- GetFileAttributes函数
一、使用_aceess函数:
使用_access函数判断文件是否存在是比较简单的方法,_access方法是在头文件<io.h中的,在使用之前要加入这个头文件,现在来看一下_access函数的形式:int_access(constchar*path,intmode);参数path:是所要判断状态的文件名。
参数mode:是判断文件状态的标志。
参数mode有以下几种形式:
00:表示判断文件是否存在
02:表示判断文件是否可写
04:表示判断文件是否可读
06:表示判断文件是否又可读又可写
#include <io.h>
string path=GetAppPath()+"\\conf.ini";
if(access(path.c_str(),0)!=-1)
{
printf("文件%s存在!\n",path.c_str());
}
else
{
printf("文件%s不存在!\n",path.c_str());
}
补充:
一、判断文件夹是否存在: 1.用CreateDirectory(".//FileManege",NULL);如果文件夹FileManege不存在,则创建。 2.或者if(_access(".//FileManege",0)==-1),表示FileManege不存在。 3.或者BOOL PathIsDirectory(LPCTSTR pszPath);
二、判断文件是否存在: 1.用if((file=fopen(".//FileManege//F//F.dat","rb"))==NULL) file=fopen(".//FileManege//F//F.dat","ab+"); // 先判断有无文件,没的话新建一个 2.用if(_access(".//FileManege//F//F.dat",0)==-1),表示文件不存在。 函数int _access( const char *path, int mode );可以判断文件或者文件夹的mode属性 mode=00;//Existence only mode=02;//Write permission mode=04;//Read permission 需要包含头文件<io.h>。
参考:http://zhidao.baidu.com/question/585753605.html
4.注册异常处理函数:
LONG WINAPI MyExceptionHandlerFunc(lpParam);
SetUnhandledExceptionFilter(MyExceptionHandlerFunc);
注:大部分异常通过此种方法都能捕获,不过栈溢出、覆盖的有可能捕获不到。
参考:http://baike.baidu.com/view/3647561.htm
5.输出当前文件的名称、当前行号等的方法
printf("file :%s\n",__FILE__);
printf("line :%d\n",__LINE__);
printf("data :%s\n",__DATE__);
printf("time :%s\n",__TIME__);
printf("timestamp:%s\n",__TIMESTAMP__);
6.获取进程id和线程id的方法
printf("processId:%d\n",GetCurrentProcessId());
printf("threadId:%d\n",GetCurrentThreadId());
7.产生dmp文件的方法
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpNormal/*MiniDumpWithPrivateReadWriteMemory*/, &ExpParam, NULL, NULL);
8.获取本机用户的方法
char userName[255];
memset(userName,0,sizeof(userName));
DWORD dwcbBuffer = 255;
GetUserName(cUserName,&dwcbBuffer);
9.调用zip程序压缩文件的方法
void zip( CString targetFile,CString srcFile)
{
SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SEE_MASK_NOCLOSEPROCESS;
si.lpVerb = _T("open");
si.lpFile = _T("7za.exe");
si.nShow = SW_HIDE;
CString apppath = GetAppPath();
CString toolDirectory=apppath+_T("LcsTool");
si.lpDirectory = toolDirectory;
CString params;
params.Format("a -y \"%s\" \"%s\"",targetFile,srcFile);//targetFile:*.zip,解压用params.Format("e \"%s\" -y -o\"%s\"",zipfile,outDir); si.lpParameters = params;
ShellExecuteEx(&si);
WaitForSingleObject(si.hProcess,INFINITE);
CloseHandle(si.hProcess);
//法2:
/*
CString cmd="7za.exe a -y D:\\Log_20130929.zip D:\\Log_20130929.log";
system(cmd.GetBuffer());
Sleep(5000);
*/
}
10.对于一个包含了很多数据成员的类来说,如果直接定义一个类对象,可能堆栈放不下,此时编译的时候会产生类似目标内存不足的警告,这时最好是将其再封装一层,将其指针放到一个结构体中,然后在该结构体的构造函数对该类在堆区申请内存,从而避免产生警告及隐藏的危害。
如:
class CTest
{
public:
CTest();
~CTest();
private:
int arr[256];
char *str[256];
...
};
如果直接定义类对象:
CTest ct;//这样栈可能放不下
此时将其改为:
struct CTestWrapper
{
public:
CTestWrapper()
{
pct = new CTest();
}
~CTestWrapper();
private:
CTest *pct;
};
CTestWrapper ctw;//这样再调用CTest中的成员函数就ok啦。
11.
vector的end()是变化的,所以在erase之前和之后获取的end是不同的!
之前list,map的end()是固定的,在erase后在erase前设置的指向end()的iterater变量不会变化,仍然指向最后一个元素,而不会因为其他元素的增加、删除而导致该iterater失效!
12.将时间字符串转换成int类型
#include "stdafx.h"
#include <string.h>
#include <stdlib.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//string类型时间转换成int类型:
char cyear[5];
char cmonth[3];
char cday[3];
char chour[3];
char cminute[3];
char csecond[3];
char cmsecond[3];
//2013-12-09 03:08:52.332
unsigned short year;
unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
unsigned char second;
unsigned char msecond;
memset(cyear,0,sizeof(cyear));
memset(cmonth,0,sizeof(cmonth));
memset(cday,0,sizeof(cday));
memset(chour,0,sizeof(chour));
memset(cminute,0,sizeof(cminute));
memset(csecond,0,sizeof(csecond));
memset(cmsecond,0,sizeof(cmsecond));
//std::string strTime("2013-12-09 03:08:52.332");//error?
//const char *p =strTime.c_str();
const char *p ="2013-12-09 03:08:52.332";
memcpy(cyear,p,4);
p=p+5;
memcpy(cmonth,p,2);
p=p+3;
memcpy(cday,p,2);
p=p+3;
memcpy(chour,p,2);
p=p+3;
memcpy(cminute,p,2);
p=p+3;
memcpy(csecond,p,2);
p=p+3;
memcpy(cmsecond,p,2);
year=atoi(cyear);
month=atoi(cmonth);
day=atoi(cday);
hour=atoi(chour);
minute=atoi(cminute);
second=atoi(csecond);
msecond=atoi(cmsecond);
//法2:
const char *q="2013-12-09 03:08:52.332";
unsigned short year2=0;
unsigned char month2;//注意,char类型是字符,但其代表的字符的值是数字!
unsigned char day2;
unsigned char hour2;
unsigned char minute2;
unsigned char second2;
unsigned char msecond2;
sscanf(q,"%d-%d-%d %d:%d:%d.%d",&year2,&month2,&day2,&hour2,&minute2,&second2,&msecond2);
return 0;
}
备注:sscanf例子:
| |
Output:
Rudolph -> 12 |
13.非MFC工程使用MFC库时,可参考以下步骤
1、工程设置中,将MFC的使用由原来的“使用标准windows库”改为“在共享DLL中使用MFC”(VC71) 如果是英文版,相关选项是: Microsoft Foundation Classes: Use MFC in a shared dll, no using MFC(VC6) 2、头文件包含 不同的MFC类需包含的头文件是不一样的。 常用的类,如Cstring, Cedit 等,包含afxwin.h就可以了 使用CFile类,则包含afx.h 如果不清楚包含什么头文件的话,可以同msdn进行查询,msdn中,对于MFC类的介绍中,都会给出相应的header file requirement. 3、#include 语句一定要写在首行 另外还要注意的是,如果#include语句是在一个头文件里,那么对应头文件的包含也要写在首行。示例如下: ============= test.h文件的内容如下: #include <afxwin.h> //保证该语句在首行 test.cpp的文件内容如下: #include “test.h” //同样也要保证该语句在首行 ============= 如果要用CFile 就#include <afx.h>引用自:http://zhidao.baidu.com/question/567431462.html