日期 & 時間
有四個與時間相關的類型:clock_t、time_t、size_t 和 tm。類型 clock_t、size_t 和 time_t 能夠把系統時間和日期表示爲某種整數。結構類型 tm 把日期和時間以 C 結構的形式保存,tm 結構的定義如下:
struct tm {
int tm_sec; // 秒,正常範圍從 0 到 59,但允許至 61
int tm_min; // 分,範圍從 0 到 59
int tm_hour; // 小時,範圍從 0 到 23
int tm_mday; // 一月中的第幾天,範圍從 1 到 31
int tm_mon; // 月,範圍從 0 到 11
int tm_year; // 自 1900 年起的年數
int tm_wday; // 一週中的第幾天,範圍從 0 到 6,從星期日算起
int tm_yday; // 一年中的第幾天,範圍從 0 到 365,從 1 月 1 日算起
int tm_isdst; // 夏令時
}
使用日期和時間相關的函數和結構,需要在 C++ 程序中引用 <ctime> 頭文件。 C++ 標準庫中操作日期和時間的函數:
函數 | 描述 |
time_t time(time_t *t) | 返回時間戳, 若參數 *t不爲空,將返回值也存儲在指針 t 指向的內存空間,若當前系統沒有時間,返回-1 |
char *ctime(const time_t *timer) |
返回一個表示當地時間的字符串,當地時間是基於參數 timer。返回的字符串格式如下: Www Mmm dd hh:mm:ss yyyy 其中,Www 表示星期幾,Mmm 是以字母表示的月份,dd 表示一月中的第幾天,hh:mm:ss 表示時間,yyyy 表示年份。 |
struct tm *localtime(const time_t *timer) | 使用 timer 的值來填充 tm 結構。timer 的值被分解爲 tm 結構,並用本地時區表示。 |
clock_t clock(void) | 返回自程序啓動起,處理器時鐘所使用的時間。如果失敗,則返回 -1 值。 |
char *asctime(const struct tm *timeptr) | 返回一個 C 字符串,包含了可讀格式的日期和時間信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期幾,Mmm 是以字母表示的月份,dd 表示一月中的第幾天,hh:mm:ss 表示時間,yyyy 表示年份。 |
struct tm *gmtime(const time_t *timer) | 該函數返回一個指向 time 的指針,time 爲 tm 結構,用協調世界時(UTC)也被稱爲格林尼治標準時間(GMT)表示。 |
time_t mktime(struct tm *timeptr) | 返回一個 time_t 值,該值對應於以參數傳遞的日曆時間。如果發生錯誤,則返回 -1 值。 |
double difftime(time_t time1, time_t time2) | 返回以雙精度浮點型 double 值表示的兩個時間之間相差的秒數 (time1 - time2) |
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) | 根據 format 中定義的格式化規則,格式化結構 timeptr 表示的時間,並把它存儲在 str 中。如果產生的 C 字符串小於 size 個字符(包括空結束字符),則會返回複製到 str 中的字符總數(不包括空結束字符),否則返回零。 |
當前日期&時間 和 tm 格式化時間
#include <iostream>
#include <ctime>
using namespace std;
int main( )
{
// 基於當前系統的當前日期/時間
time_t now = time(0);
// 把 now 轉換爲字符串形式
char* dt = ctime(&now);
cout << "本地日期和時間:" << dt << endl;
// 把 now 轉換爲 tm 結構
tm *gmtm = gmtime(&now);
dt = asctime(gmtm);
cout << "UTC 日期和時間:"<< dt << endl;
// 輸出 tm 結構的各個組成部分
cout << "年: "<< 1900 + gmtm->tm_year << endl;
cout << "月: "<< 1 + gmtm->tm_mon<< endl;
cout << "日: "<< gmtm->tm_mday << endl;
cout << "時間: "<< gmtm->tm_hour << ":";
cout << gmtm->tm_min << ":";
cout << gmtm->tm_sec << endl;
}
tm 結構在 C/C++ 中處理日期和時間相關的操作時,顯得尤爲重要。箭頭 -> 運算符來訪問結構成員。
輸入&輸出
C++ 的 I/O 發生在流中,流是字節序列。如果字節流是從設備(如鍵盤、磁盤驅動器、網絡連接等)流向內存,這叫做輸入操作。如果字節流是從內存流向設備(如顯示屏、打印機、磁盤驅動器、網絡連接等),這叫做輸出操作。
I/O 庫頭文件
頭文件 | 描述 |
<iostream> | 該文件定義了 cin(標準輸入流)、cout(標準輸出流)、cerr (非緩衝標準錯誤流)和 clog (緩衝標準錯誤流)對象 |
<iomanip> | 該文件通過所謂的參數化的流操縱器(比如 setw 和 setprecision),來聲明對執行標準化 I/O 有用的服務 |
<fstream> | 該文件爲用戶控制的文件處理聲明服務 |
標準輸入流 cin
預定義的對象 cin 是 iostream 類的一個實例。cin 對象附屬到標準輸入設備,通常是鍵盤。cin 是與流提取運算符 >> 結合使用的,流提取運算符 >> 在一個語句中可以多次使用
C++ 編譯器根據要輸入值的數據類型,選擇合適的流提取運算符來提取值,並把它存儲在給定的變量中。
標準輸出流 cout
預定義的對象 cout 是 iostream 類的一個實例。cout 對象"連接"到標準輸出設備,通常是顯示屏。cout 是與流插入運算符 << 結合使用的,流插入運算符 << 在一個語句中可以多次使用。
C++ 編譯器根據要輸出變量的數據類型,選擇合適的流插入運算符來顯示值。<< 運算符被重載來輸出內置類型(整型、浮點型、double 型、字符串和指針)的數據項。
輸出流中的函數(模板):
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout<<setiosflags(ios::left|ios::showpoint); // 設左對齊,以一般實數方式顯示
cout.precision(5); // 設置除小數點外有五位有效數字
cout<<123.456789<<endl;
cout.width(10); // 設置顯示域寬10
cout.fill('*'); // 在顯示區域空白處用*填充
cout<<resetiosflags(ios::left); // 清除狀態左對齊
cout<<setiosflags(ios::right); // 設置右對齊
cout<<123.456789<<endl;
cout<<setiosflags(ios::left|ios::fixed); // 設左對齊,以固定小數位顯示
cout.precision(3); // 設置實數顯示三位小數
cout<<999.123456<<endl;
cout<<resetiosflags(ios::left|ios::fixed); //清除狀態左對齊和定點格式
cout<<setiosflags(ios::left|ios::scientific); //設置左對齊,以科學技術法顯示
cout.precision(3); //設置保留三位小數
cout<<123.45678<<endl;
return 0;
}
其中 cout.setf 跟 setiosflags 一樣,cout.precision 跟 setprecision 一樣,cout.unsetf 跟 resetiosflags 一樣。
setiosflags(ios::fixed) 固定的浮點顯示
setiosflags(ios::scientific) 指數表示
setiosflags(ios::left) 左對齊
setiosflags(ios::right) 右對齊
setiosflags(ios::skipws 忽略前導空白
setiosflags(ios::uppercase) 16進制數大寫輸出
setiosflags(ios::lowercase) 16進制小寫輸出
setiosflags(ios::showpoint) 強制顯示小數點
setiosflags(ios::showpos) 強制顯示符號
cout.setf 常見的標誌:
標誌 | 功能 |
---|---|
boolalpha | 可以使用單詞”true”和”false”進行輸入/輸出的布爾值. |
oct | 用八進制格式顯示數值. |
dec | 用十進制格式顯示數值. |
hex | 用十六進制格式顯示數值. |
left | 輸出調整爲左對齊. |
right | 輸出調整爲右對齊. |
scientific | 用科學記數法顯示浮點數. |
fixed | 用正常的記數方法顯示浮點數(與科學計數法相對應). |
showbase | 輸出時顯示所有數值的基數. |
showpoint | 顯示小數點和額外的零,即使不需要. |
showpos | 在非負數值前面顯示”+(正號)”. |
skipws | 當從一個流進行讀取時,跳過空白字符(spaces, tabs, newlines). |
unitbuf | 在每次插入以後,清空緩衝區. |
internal | 將填充字符回到符號和數值之間. |
uppercase | 以大寫的形式顯示科學記數法中的”e”和十六進制格式的”x”. |
非緩衝標準錯誤流 cerr
預定義的對象 cerr 是 iostream 類的一個實例。cerr 對象附屬到標準錯誤設備,通常也是顯示屏,但是 cerr 對象是非緩衝的,且每個流插入到 cerr 都會立即輸出。cerr 也是與流插入運算符 << 結合使用的
緩衝標準錯誤流 clog
預定義的對象 clog 是 iostream 類的一個實例。clog 對象附屬到標準錯誤設備,通常也是顯示屏,但是 clog 對象是緩衝的。這意味着每個流插入到 clog 都會先存儲在緩衝在,直到緩衝填滿或者緩衝區刷新時纔會輸出。clog 也是與流插入運算符 << 結合使用的
所以,使用 cerr 流來顯示錯誤消息,而其他的日誌消息則使用 clog 流來輸出。