2017-08-26 99 views
2

下面是IBM報價(在C99標準還規定)爲什麼在fopen()創建的文件流的輸入和輸出操作之間需要fflush()?

當您打開一個文件進行更新,可以對所得到的數據流進行輸入和輸出 操作。但是,輸出操作 不能在沒有插入fflush子例程調用或文件定位操作 (fseek,fseeko,fseeko64,fsetpos,fsetpos64或倒帶子例程)的情況下不進行輸入操作。 此外,除非輸入操作遇到文件末尾,否則輸入操作不能直接跟隨輸出 操作而沒有介入的刷新或文件定位操作, 。

爲什麼這是必要的?

+0

[MSDN says](https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx)當指定「r +」,「w +」或「a +」訪問類型時,讀取和寫入被啓用(該文件被稱爲「更新」)。但是,從閱讀切換到書寫時,輸入操作必須遇到EOF標記。如果沒有EOF,則必須使用中間調用文件定位功能。文件定位函數是'fsetpos','fseek'和'rewind'。從寫入切換到讀取時,必須使用中間調用來調用fflush或文件定位功能。 –

+0

請注意,上述內容在從閱讀切換到書寫時不推薦'fflush'(與IBM描述相反)。儘管MSVC實現了輸入緩衝區刷新,這是實現定義的。 –

回答

0

這些操作可能會被緩衝以避免將每個單獨的字節單獨寫入磁盤。在開始閱讀之前,我們必須確保所有先前的寫入實際上存儲在磁盤上。

另外,無論如何都需要尋找找到你想要閱讀的東西。所以在實踐中不是問題。

0

以允許輸入和輸出操作自由混合的方式編寫標準流功能是可行的。的C標準不強加這樣的限制對庫作者主要有兩個原因:

  • 限制方向改變某些操作允許一些最佳化,減少的測試次數爲基本輸入/輸出功能,例如getc()putc(),它們通常被實現爲簡單的宏。

  • 歷史實現充分利用了上述優點,並且對於如何以及何時允許改變方向已經存在限制。 C標準委員會只是將這些限制正式化,以允許現有代碼符合要求。

C庫的較新版本時必須鎖定所有輸入/輸出操作流,所以對於一個方向改變的額外的測試將有微不足道的成本,但C標準是不太可能解除限制。

相關問題