time_t time(time_t *time) 从1970年1月1日到到现在的秒数,如果系统时间不存在,返回1
char *ctime(const time_t *time) 返回以:day month year hours:minutes:seconds year
格式的时间字符串指针
struct tm *localtime(const time_t *time) 返回现在时间的tm结构体的指针
clock_t clock(void) 返回程序调用到现在的时间,1为不可用
char * asctime ( const struct tm * time) 返回time为名的结构体转换为的字符串指针,格式为:day month date hours:minutes:seconds year
struct tm *gmtime(const time_t *time) 返回tm结构体指针的UTC时间
time_t mktime(struct tm *time) 返回time结构提指针中与日历时间相等的时间
double difftime ( time_t time2, time_t time1 ) 比较1和2两个时间的差值
size_t strftime() 格式化时间
#include <stdarg.h> #include <iostream> #include <sstream> #include <string> #include <tchar.h> // cl.exe /D "_UNICODE" /D "UNICODE" /Ox /EHsc /W3 /WX- /FeDateSpan.exe dateSpan.cpp namespace SkDate { const int daysMonthly[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; // 是否闰年 bool IsLeapyear(int year) { return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); } // 某月的总天数 int DaysOfMonth(int year, int month) { int nCount = daysMonthly[month - 1]; if (month == 2 && IsLeapyear(year)) { nCount += 1; } return nCount; } // 获取公历年初至某整月的天数 int DaysTillMonth(int year, int month) { int sumDays = 0; for (int index = 0; index < month - 1; index++) { sumDays += daysMonthly[index]; if (IsLeapyear(year) && index == 1) { sumDays += 1; } } return sumDays; } // 获取从公元元年1月1日至当前日期的总天数 int GetAllDaysTill(int year, int month, int day) { int i = 1; int nDays = day; while (i < year) { nDays += IsLeapyear(i) ? 366 : 365; i++; } nDays += DaysTillMonth(year, month); return nDays; } // 检查输入日期是否正确 bool IsValidDate(int year, int month, int day) { if (month < 1 || month > 12 || day < 1 || day > SkDate::DaysOfMonth(year, month)) { return false; } return true; } } using namespace std; wstring FormatWstring(const wchar_t * _Format, ...) { wstring _str; va_list marker = NULL; va_start(marker, _Format); int num_of_chars = _vsctprintf(_Format, marker); if (num_of_chars > _str.capacity()) { _str.resize(num_of_chars + 1); } _vstprintf_s((wchar_t *)_str.c_str(), num_of_chars+1, _Format, marker); va_end(marker); _str.resize(num_of_chars); return _str; } int _tmain(void) { int year1 = 0, month1 = 0, day1 = 0; int date[3] = { 0 }; // 设定缺省的中文环境,cout不显示千位上的逗号 wcout.imbue(locale("", std::locale::all ^ std::locale::numeric)); wcout << _T("☆请输入起始日期(输入格式yyyy-mm-dd): "); wchar_t chr; wcin >> year1 >> chr >> month1 >> chr >> day1; if (!SkDate::IsValidDate(year1, month1, day1)) { wcout << _T("输入格式错误!") << endl; return -1; } wcin.ignore(std::numeric_limits<std::streamsize>::max(), wcin.widen(' ')); wcout << _T("★请输入终止日期(输入格式yyyy-mm-dd): "); wstring strFmt; getline(wcin, strFmt); wstringstream strs(strFmt); int nIndx = -1; while (getline(strs, strFmt, _T('-'))) { date[++nIndx] = stoi(strFmt); } if (nIndx != 2 || !SkDate::IsValidDate(date[0], date[nIndx-1], date[nIndx])) { wcout << _T("输入格式错误!") << endl; return -1; } wcout << FormatWstring(_T(" %4d年%2d月%2d日 到 %4d年%2d月%2d日 间隔"), year1, month1, day1, date[0], date[1], date[2]); int days1 = SkDate::GetAllDaysTill(year1, month1, day1); int days2 = SkDate::GetAllDaysTill(date[0], date[1], date[2]); int sout = abs(days1 - days2); wcout << sout << _T("天。") << endl; return 0; }
https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c#
C++执行命令行指令并获取命令行执行后的输出结果
https://blog.csdn.net/VonSdite/article/details/81295056
1. popen(可获取命令行执行后的输出结果)
popen()可以执行shell命令,并读取此命令的返回值;
popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。可以通过这个管道执行标准输入输出操作。这个管道必须由pclose()函数关闭, 而不是fclose()函数(若使用fclose则会产生僵尸进程)。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。
函数原型
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
command参数
是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。
type参数
只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。
如果type是”r”则文件指针连接到command的标准输出;
如果type是”w”则文件指针连接到command的标准输入。
返回值
如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。
popen()没有为内存分配失败设置errno值。
如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。
如果type参数不合法,**errno将返回EINVA**L。
例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> void print_result(FILE *fp) { char buf[100]; if(!fp) { return; } printf(" >>> "); while(memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf) - 1, fp) != 0 ) { printf("%s", buf); } printf(" <<< "); } int main(void) { FILE *fp = NULL; while(1) { fp = NULL; fp = popen("ls", "r"); if(!fp) { perror("popen"); exit(EXIT_FAILURE); } print_result(fp); pclose(fp); sleep(1); } }
2. 使用Windows API的管道(可获取命令行执行后的输出结果,功能比1强大)
使用匿名管道和CreateProcess函数实现不弹出黑框,获取命令行执行后输出结果。
使用CreateProcess可以设置命令行启动信息、 可以指定命令行执行的目录等等。
std::wstring Connection::ExeCmd(std::wstring pszCmd) { // 创建匿名管道 SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; HANDLE hRead, hWrite; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { return TEXT(" "); } // 设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWrite STARTUPINFO si = {sizeof(STARTUPINFO)}; GetStartupInfo(&si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdError = hWrite; si.hStdOutput = hWrite; // 启动命令行 PROCESS_INFORMATION pi; if (!CreateProcess(NULL, (LPWSTR)pszCmd.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { return TEXT("Cannot create process"); } // 立即关闭hWrite CloseHandle(hWrite); // 读取命令行返回值 std::string strRetTmp; char buff[1024] = {0}; DWORD dwRead = 0; strRetTmp = buff; while (ReadFile(hRead, buff, 1024, &dwRead, NULL)) { strRetTmp += buff; } CloseHandle(hRead); LPCSTR pszSrc = strRetTmp.c_str(); int nLen = MultiByteToWideChar(CP_ACP, 0, buff, -1, NULL, 0); if (nLen == 0) return std::wstring(L""); wchar_t* pwszDst = new wchar_t[nLen]; if (!pwszDst) return std::wstring(L""); MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, pwszDst, nLen); std::wstring strRet(pwszDst); delete[] pwszDst; pwszDst = NULL; return strRet; }