☆ C/C++ 即时刷新并显示当前时间

原先想着在原文章上进行修改,可是一直提示修改失败( ・´ω`・ )

转之想一想,而且那篇文章中也没有把光标定位放在一个函数中调用,

那就再另开一篇文章使用gotoxy()定位函数通过调用输出,顺便再复习以前的知识点。

 



★源码(有bug):

#include <iostream> 
#include <windows.h>
#include <time.h>
using namespace std;

void gotoxy(int x,int y)
{
	COORD pos={x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut,pos);
}

int main()
{
	time_t t;
	struct tm *data_time;
	cout << "当前时间: " << endl; 
	while(1)
	{
		gotoxy(10,0);
		time(&t);
		data_time = localtime(&t);
		cout << data_time->tm_hour << ":" << data_time->tm_min << ":" << data_time->tm_sec ;
		Sleep(1000);
	}
}

Bug修复版本:

(感谢qq_43735062友友指出错误^.^)

修复内容:

1> 解决秒数为个位数时的异常显示

2> 将gotoxy()传入的参数数据类型由int改为short

3> 将localhost()更换为localhost_s() :

*【不推荐】当然这里也可以使用预处理语句#define _CRT_SECURE_NO_WARNINGS来继续使用localhost()

函数官方定义:

static __inline struct tm* __CRTDECL localtime(
            _In_ time_t const* const _Time
            )
        {
            #pragma warning(push)
            #pragma warning(disable: 4996)
            return _localtime64(_Time);
            #pragma warning(pop)
        }

static __inline errno_t __CRTDECL localtime_s(
                _Out_ struct tm*    const _Tm,
                _In_  time_t const* const _Time
                )
            {
                return _localtime64_s(_Tm, _Time);
            }

4> 增加 "取消光标闪动的函数" :void No_Cursor()

//#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <windows.h>
#include <time.h>
using namespace std;

void No_Cursor()
{
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize = 1;
	cci.bVisible = false;
	SetConsoleCursorInfo(hOut, &cci);
}

void gotoxy(short x, short y)
{
	COORD pos = { x,y };
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	No_Cursor();
}

int main()
{
	time_t t;
	struct tm *data_time = new tm;
	cout << "当前时间: " << endl;
		while (true)
	{
		gotoxy(10, 0);
		time(&t);
		localtime_s(data_time, &t);
		if (data_time->tm_sec >= 10)
		{
			cout << data_time->tm_hour << ":" << data_time->tm_min << ":" << data_time->tm_sec;
		}
		else
		{
			cout << data_time->tm_hour << ":" << data_time->tm_min << ":0" << data_time->tm_sec;
		}
		Sleep(1000);
	}
}

 

【附加】

这里我们来将时间显示函数封装成一个.h头文件,需要使用的时候在主函数直接调用即可:

Main.cpp

#include "Display_Time.h"

int main()
{
	Display_Localtime();
}

 

Display_Time.h

//#define _CRT_SECURE_NO_WARNINGS
//#pragma once
#include <iostream> 
#include <windows.h>
#include <time.h>
using namespace std;

void No_Cursor()
{
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize = 1;
	cci.bVisible = false;
	SetConsoleCursorInfo(hOut, &cci);
}

void gotoxy(short x, short y)
{
	COORD pos = { x,y };
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	No_Cursor();
}

void Display_Localtime()
{
	time_t t;
	struct tm *data_time = new tm;
	cout << "当前时间: " << endl;
	while (true)
	{
		gotoxy(10, 0);
		time(&t);
		data_time = localtime(&t);    //Dev中使用原版 
		//localtime_s(data_time, &t);    //VS2010中优化了localtime函数为localtime_s()函数 -> Security 
		if (data_time->tm_sec >= 10)
		{
			cout << data_time->tm_hour << ":" << data_time->tm_min << ":" << data_time->tm_sec;
		}
		else
		{
			cout << data_time->tm_hour << ":" << data_time->tm_min << ":0" << data_time->tm_sec;
		}
		Sleep(1000);
	}
}

int main()
{
	Display_Localtime();
}

注意事项:

 DEV中使用localtime_s()报错:

 

(附加:dev编译C++使用的是GCC编译器,而VS使用的是微软自家的VS编译器)

DEV官方版本已经很久没有更新,这就意味着在安装DEV时安装在本地设备上的函数库也已经是很久以前的了(但是它还是一个很稳定的C++开发环境),

但是VS不同,VS作为一个集成开发环境可以使用各种语言开发,因此C++库也是最新的,就上述问题而言:

dev中无法使用localtime_s(),因为localtime_s()是time.h库更新后新加的函数,而dev中的time.h是旧版本的,localtime_s中的s即Security(安全)即优化版本;

在新版的VS中写C++可以使用localtime_s()与localtime()函数来对时间进行格式化,但是DEV中只能使用localtime()。

 

 

 



传送门:点我即达原文章,有详细介绍

☆仅仅记录日常编写代码 与 疑问(`・ω・´)

 

 

 



             最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。



 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值