2016-11-27 23 views
1

我想將STDOUT重定向到磁盤上的文件。重點是讓我的程序中的printf寫入文件而不是控制檯。fclose(stdout)vs close(STDOUT_FILENO) - C

我看到他們過去在網絡上的一些文章:

dup2(fileno(outputFile), STDOUT_FILENO); 

或者:他們使用

close(STDOUT_FILENO); 
dup(fileno(outputFile)); 

在每一個教學關閉()和它的實際工作。不過我很好奇,我試圖用FCLOSE(標準輸出)來代替,但有些錯誤發生了,當我試圖用printf:

fclose(STDOUT_FILENO); 
dup(fileno(outputFile)); 

錯誤:

Bad file descriptor 

我的問題是,爲什麼FCLOSE做()不工作但close()呢?

謝謝。

+0

如果您只是想將stdout重定向到文件,請使用shell重定向。如果你想學習如何使用C重定向文件,你應該改寫這個問題。 –

回答

3

STDOUT_FILENO是一個數字文件描述符(通常爲1)。當您使用close時,您釋放描述符,但隨後使用dup2重新指定。任何輸出到該描述符現在將轉到新文件。

stdout另一方面是FILE*,它是一個包含文件描述符的排序對象。將printf格式輸出到與FILE關聯的緩衝區中,然後將write作爲描述符的緩衝區(取決於緩衝模式)。當fclose a FILE*時,它(通常)close是底層描述符,並釋放了對象FILEdup2不會保證stdout,所以printf失敗。