屏幕輸出VS文件輸出



問題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;

} 

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