目錄標準IO練習題題目:分析:代碼展示結果展示總結知識擴展time()函數localtime()函數 標準IO練習題 題目: 設計程式,獲取當前系統時間,把時間轉換為特定格式”yy年mm月dd日 星期x tt:mm:ss”,並每隔1s寫入到本地磁碟中一個叫做log.txt的文本中,如果文本不存在則創 ...
目錄
標準IO練習題
題目:
設計程式,獲取當前系統時間,把時間轉換為特定格式”yy年mm月dd日 星期x tt:mm:ss”,並每隔1s寫入到本地磁碟中一個叫做log.txt的文本中,如果文本不存在則創建。
分析:
本題目需要利用time()獲取當前系統時間,但由於time()是將獲取得到的時間以秒的形式返回,使用起來諸多不便,所以還需要採用localtime()對time()獲取數據進行處理。請註意,此時得到的數據並不是正確的系統時間。這是因為localtime()內部定義導致的,所以需要人為的對獲取到的數值進行處理。
本題目還需要將獲取時間值寫入本地磁碟文本中,寫入方式有很多。但由於localtime()內部變數均為int類型,所以筆者調用fprintf()函數直接將數據寫入到目標文件中。
本題目還要求每隔一秒寫入文本中,且文本不存在需要創建。故而fopen的mode不能使用“r+b",且需要調用sleep()配合死迴圈完成每隔一秒寫入文本的要求。
代碼展示
/************************************************************************************
*
* file name: get_time.c
* author : [email protected]
* date : 2024/05/09
* function : 該案例需獲取當前系統時間,把時間轉換為特定格式”yy年mm月dd日
星期x tt:mm:ss”,並每隔1s寫入到本地磁碟中一個叫做log.txt的文本中,
如果文本不存在則創建。
* note : 該案例需要調用localtime()函數、time()和相關標準IO函數,
並且對localtime函數獲取值進行處理
*
* CopyRight (c) 2023-2024 [email protected] All Right Reseverd
*
* *******************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, const char *argv)
{
while(1)
{
//打開log.txt文件,若不存在,則創建該文件
FILE *fp = fopen("log.txt", "a+b");
if(fp == NULL)
{
printf("log.txt is open fail\n");
exit(-1);
}
//利用time()獲取當前系統時間,並將返回值存儲起來
time_t systime = time(NULL);
//利用localtime()對獲取值進行處理,並將處理後的數據寫入目標文件中
struct tm *systimep = localtime(&systime);
systimep->tm_year += 1900;
systimep->tm_mon += 1;
fprintf(fp, "%d 年 %d 月 %d 日 星期%d %d:%d:%d", systimep->tm_year,
systimep->tm_mon,
systimep->tm_mday,
systimep->tm_wday,
systimep->tm_hour,
systimep->tm_min,
systimep->tm_sec);
//防止寫入數據重疊不好看
fprintf(fp, "\n");
// 每隔1秒寫入一次
fclose(fp);
sleep(1);
}
return 0;
}
結果展示
總結
經過驗證,上述代碼可以基本完成題目要求。
但是可以對代碼進行優化,例如上圖中的星期4並不好看,或許可以通過枚舉對其進行判斷改名;又或是該文本寫入後,數據只會從末尾開始寫起,當用戶需要對文本進行刷新輸入的時候,目前程式無法辦到。
總而言之,該題目的要求已基本達到,且加深了對於標準IO函數的使用,以及對於time()和localtime()的使用。
知識擴展
time()函數
註意:
- time()是有參數的,但是在使用過程中,一般填為NULL,再設置一個time_t 的變數接受其返回值
- time()是以秒為單位獲取時間,且其返回值也是以秒為單位,其意義為從1970-01-01 00:00:00 到當前系統時間的秒數
localtime()函數
該函數的返回值是一個tm結構體指針變數,且需要傳入一個time_t *作為參數。因此,該函數需要與time()一起使用。
註意:
- tm結構體中的變數均為 int 類型,且細分為年月日,時分秒。使用時可以利用結構體指針進行對其調用。
- tm結構體中的tm_year變數是當前系統時間減去1900後的數據,所以實際使用中需要加上1900得到當前系統時間年數值。
- tm結構體中的tm_mon變數意為月份,但是其數值範圍為0-11與實際中1-12月份不同,所以實際使用中需要手動對其+1.