vc++常用函数总结

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例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="Rudolph is 12 years old";
  char str [20];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);
  
  return 0;
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值