C++學習開始就夭折系列:基本語法6

日期 & 時間

有四個與時間相關的類型: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 流來輸出。

發佈了178 篇原創文章 · 獲贊 95 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章