問題1:我們在編寫程序時經常需要數一些數據到屏幕,來查看我們的結果是否正確,雖然直接輸出到屏幕,查看起來呢很方便,但當數據量很大時,需要耗費大量的時間。於是我們想到能不能通過輸出到文件來減少時間能。相同的數據是輸出到屏幕更快還是輸出到文件更快?
這個地方變量有很多:磁盤速度、目的文件有沒有其他IO請求、文字渲染的方式、API具體的操作流程、操作系統本身的設計等等都會影響輸出到文件的速度。但一般來說還是會比直接輸出到屏幕快(而且通常快幾個數量級)。
比如我們可以用如下代碼進行測試,如果測試輸出到文件的時間就在開頭加入#define ToFile,如果測試輸出到屏幕的時間,就註釋掉。
//#define ToFile
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start_test,end_test;
start_test = clock();
FILE *output_fils;
output_fils = fopen("output_file.txt","w");
if(output_fils == NULL)
{
perror("Error to create the file\n");
}
long unsigned int i;
for(i=0;i<1000000;i++)
{
#ifdef ToFile
fprintf(output_fils,"item %ld\n",i);
#else
printf("item %ld\n",i);
#endif
}
fclose(output_fils);
end_test = clock();
printf("The total time is: %lf",((double)(end_test-start_test)/CLOCKS_PER_SEC));
return 0;
}
通過編譯運行,我們會發現,如果輸出到文件僅需要0.015s,但是直接輸出到屏幕卻需要12.906s,兩者差距很大。
問題2:既然輸出到文件要比輸出到屏幕快的多,那我們怎樣編程使結果全部輸出到文件呢?
當然,你可以在每個需要輸出的地方用fprintf來設置輸出到文件。但是考慮到那樣太麻煩了,而且我們已經系管理直接使用printf,所以我們可以用一個函數freopen來把標準輸出流導出到我們設定的文件流中,這樣我們以後用printf輸出到東西全部到達我們設定的文件中。
但是有個問題是,那我們如何在某些特定的時候在屏幕上輸出提示信息呢?考慮到標準錯誤流也是輸出到屏幕,所以我們可以假借這個標準錯誤流。示例代碼如下:
#include <stdio.h>
int main()
{
int num;
freopen("output_file.txt","w",stdout);
fprintf (stderr,"Please input your num:"); // output to the screen
scanf("%d",&num);
printf("The num that you input is:%d",num); // output to the file
fclose (stdout);
return 0;
}