我想顯示程式啟動后經過的秒數:
volatile time_t start_time = time(NULL);
volatile time_t target_seconds = 60*60*17;
volatile time_t time_passed = 0;
while(1)
{
time_passed = time(NULL)-start_time;
printf("\rTime elapsed=%lu/%lu(seconds)", time_passed, target_seconds);
}
輸出:
Time elapsed=1/61200(second)
但無論 time_passed 是什么值,它都會不斷更新顯示。
現在我只想更新實際時間增加時經過的顯示時間。所以我以這種方式更改了程式:
volatile time_t start_time = time(NULL);
volatile time_t target_seconds = 60*60*17;
volatile time_t time_passed = 0;
while(1){
if ((time(NULL)-start_time) != time_passed)
{
time_passed = time(NULL)-start_time;
printf("\rTime elapsed=%lu/%lu(seconds)", time_passed, target_seconds);
}
}
現在它什么也沒有顯示。誰能解釋為什么以及如何解決它。
uj5u.com熱心網友回復:
你的代碼很好。
但是根據您的平臺,僅在\n列印 a 時才會重繪 輸出緩沖區。
因此,您應該fflush(stdout);在printf.
if ((time(NULL)-start_time) != time_passed)
{
time_passed = time(NULL)-start_time;
printf("\rTime elapsed=%lu/%lu(seconds)", time_passed, target_seconds);
fflush(stdout);
}
順便說一句:如果您等待的時間足夠長,您最終會看到一些輸出,因為最終輸出緩沖區將滿,然后所有內容都會立即顯示,這在這里當然沒有多大意義。
您立即看到代碼的第一個版本輸出的原因是您正在連續列印,因此輸出緩沖區將很快滿,并且它將被連續重繪 ,因此您會看到輸出。
這里volatile不需要關鍵字,絕對沒有必要,但也無害。
uj5u.com熱心網友回復:
除了在每次 printf 之后呼叫 fflush 之外,還可以關閉 stdout 上的緩沖。使用 setbuf 或 setvbuf
#include <stdio.h>
setbuf(stdout, NULL);
setvbuf(stdout, NULL, _IONBF, 0);
現在每個字符都會被列印出來
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487814.html
標籤:C
上一篇:C系統()函式
