5.4 標準I/O庫_緩衝

    標準I/O提供了三種類型的緩衝。

  • 全緩衝: 在填滿標準I/O緩衝區後才進行實際I/O操作。對於駐留在磁盤上的文件通常是有標準I/O庫實施全緩衝。
  • 行緩衝: 當在輸入和輸出中遇到換行符時,標準I/O庫執行I/O操作。當涉及一個終端(例如標準輸入和輸出),通常使用行緩衝。對於行緩衝有兩個限制。第一,因爲標準I/O庫用來收集每一行的緩衝區的長度是固定的,所以只要填滿了緩衝區,那麼即使還沒有寫一個換行符,也進行I/O操作。第二,任何時候只要通過標準I/O庫要求從(a)一個不帶緩衝的流,或者(b)一個行緩衝的流(它要求從內核得到數據)得到輸入數據,那麼就會造成沖洗所有行緩衝輸出流。
  • 不帶緩衝: 標準I/O庫部隊字符進行行緩衝存儲。

    標準出錯流stderr通常是不帶緩衝的,這就使得出錯信息可以儘快顯示出來,而不管它們時候含有一個換行符。

    ISO C要求下列緩衝特徵:

  • 當且僅當標準輸入和標準輸出並不涉及交互式設備是,它們纔是全緩衝的。
  • 標準出錯決不會是全緩衝的。

    很多系統默認使用下列類型的緩衝:

  • 標準出錯是不帶緩衝的。
  • 如若是涉及終端設備的其他流,則它們是行緩衝的,否則是全緩衝的。

    標準出錯是不帶緩衝的,打開至終端設備的流是行緩衝的;其他所有流則是全緩衝的。

    可調用下列兩個函數中的一個更改緩衝類型:

  • #include <stdio.h>
  • void setbuf(FILE *restrict fp, char *restrict buf);
  • void setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);

返回值:成功返回0,出錯返回非0值

    可以使用setbuf函數打開或關閉緩衝機制。通常在此之後該流就是全緩衝的,但是如果該流與一個終端設備相關,那麼某些系統也可將其設置爲行緩衝。爲了關閉緩衝,將buf設置爲NULL。

    使用setvbuf,我們可以精確地指定所需的緩衝類型。這是用mode參數實現的:

  • _IOFBF    全緩衝
  • _IOLBF    行緩衝   
  • _IONBF    不帶緩衝

    如果指定一個不帶緩衝的流,則忽略buf和size參數。如果指定全緩衝或行緩衝,則buf和size可選擇地指定一個緩衝區及其長度。如果該流是帶緩衝的,而buf是NULL,則標準I/O庫將自動地爲該流分配適當長度的緩衝區。適當長度指的是由常量BUFSIZE所指定的值。

    如果一個函數內分配一個自動變量類的標準I/O緩衝區,則從該函數返回之前,必須關閉該流。另外,有些實現將緩衝區的一部分用於存放它自己的管理操作信息,所以可以存放緩衝區中的實際數據字節少於size。一般而言,應由系統選擇緩衝區的長度,並自動分配緩衝區。在這種情況下關閉此流時,標準I/O庫將自動釋放緩衝區。

    任何時候,都可以強制沖洗一個流

  • #include <stdio.h>
  • int fflush(FILE *fp);

返回值:成功返回0,出錯返回EOF

此函數使該流所有未寫的數據都被傳送至內核。作爲一個特例,如若fp是NULL,則此函數將導致所有輸出流被沖洗。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章