• C++练习,计算间隔天数


    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;
    }
  • 相关阅读:
    Codeforces 385 D Bear and Floodlight
    Linux经常使用的命令(两)
    hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书
    android Notification分析—— 您可能会遇到各种问题
    人类探索地外文明的显著取得的进展
    腰带“兄弟”事实上,投资
    C++机器学习古典材料
    [Recompose] Render Nothing in Place of a Component using Recompose
    [Recompose] Replace a Component with Non-Optimal States using Recompose
    [Recompose] Show a Spinner While a Component is Loading using Recompose
  • 原文地址:https://www.cnblogs.com/shankun/p/cpp_practice_date_interval.html
Copyright © 2020-2023  润新知