2015-05-19 173 views
4

在我的代碼中有一些函數需要一段時間才能執行,比如計算大文件中的字數。我想展現給用戶這樣的輸出:C程序沒有以正確的順序執行

calculating word number ...

執行功能,然後打印:calculating word number ... OK

要做到這一點,我在我的主:

int main(int argc, char * argv[]) 
{ 
    int number_of_words; 
    FILE * dico = NULL; 
    dico = fopen(argv[1],"r+"); 

    printf("calculating word number ..."); 
    number_of_words = number(dico); 
    printf("OK\n"); 

    return 3.14; 
} 

而且計算字數的函數爲:

int number(FILE * dico) 
{ 
    int n=0; 
    char mot[20]; 

    rewind(dico); 

    while (fgets(mot, 20, dico) != NULL) 
    { 
     n+=1; 
    } 

    return n; 
} 

執行真正大文件輸入的函數後,看起來輸出不如參與。其實等待的時間是之前第一個printf("calculating word number ...");然後當它是所有的printf一起完成。

爲什麼會發生這種情況?

+2

可能的重複[爲什麼printf在調用後不刷新,除非換行符在格式字符串中?](http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-除非換行符在格式中) – dbarnes

+1

歡迎使用緩衝和非緩衝I/O之間的區別。 –

回答

5

您的輸出正在被緩衝。由於在第一次打印時沒有行結束,它將被stdout緩衝並且不會顯示。如果有足夠多的字符會寫入它,或者如果它有一行結尾,或者stdout被刷新或寫入了一個無緩衝的流(如stderr),它可能會馬上顯示出來。

雖然它仍然按照正確的順序執行,但它不會立即顯示內容。

+0

我在執行函數之前使用了fflush(stdout),現在它效果很好!非常感謝 !! – hugz