原先想着在原文章上进行修改,可是一直提示修改失败( ・´ω`・ )
转之想一想,而且那篇文章中也没有把光标定位放在一个函数中调用,
那就再另开一篇文章使用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()。
传送门:点我即达原文章,有详细介绍
☆仅仅记录日常编写代码 与 疑问(`・ω・´)
最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。