從 C 程式角度來看,無論程式一次讀寫的是一個字元、位元組、文字行還是給定大小的資料區域,作為輸入輸出的各種檔案和裝置統一以邏輯資料流的方式展現。
C 語言中的資料流可以是文字流或者二進位制流,甚至在某些系統上,就連這樣的差異也不存在。
通過使用函數 fopen()(或 tmpfile())開啟一個檔案就會建立一個新的流,直到呼叫函數 fclose(),該流才會結束。C 語言將檔案的管理工作交由執行環境(也就是執行程式的系統)。因此,流是一個傳輸通道,利用該通道,資料可以從執行環境流入程式中,或從程式流向執行環境。C 語言對裝置(例如控制台)的處理機制與對檔案的機制是一樣的。
每個流都有一個鎖機制,當多個執行緒存取同一個流時,I/O 庫函數利用該鎖以保證同步性。當對一個流執行讀寫操作,或者查詢和移動流檔案位置指示器時,所有流 I/O 函數會首先獲得獨占存取該流的許可權。一旦操作完成,流的許可權就會被再次釋放,以供其他執行緒存取。獨占流存取許可權可以防止“資料競爭”和並行的 I/O 操作。
文字流
文字流用來傳輸文字中的字元,這裡的文字被分割成許多行。文字行都包含一個字元序列,並以換行符作為該序列結尾。文字行也可以為空,也就是說只包含一個換行符。文字最後一行可以有,也可以沒有用作結尾的換行符,這由 C 語言的實現版本決定。
C 程式中文字的內部表示方式都是一樣的,不受程式執行時所在系統的影響。在給定系統上進行文字輸入和輸出操作,涉及刪除、增加或改變給定的字元。例如,在不是 Unix 核心的作業系統上,在讀取文字檔案時,行尾修飾符通常必須轉換成換行符。
對 Windows 系統而言,行尾修飾符由兩個控制字元組成:r(回車)和 n(換行)。類似,在 Windows 平台上,文字流中的控制字元 ^Z(字元碼 26),用來表示文字流的結束。
程式設計師通常不必擔心這些系統平台間必要的適應性,因為標準庫的 I/O 函數會自動完成轉換。然而,如果想確保呼叫輸入函數會生成與之前呼叫輸出函數時同樣的文字,那麼文字中除了可列印字元以外,只能包含換行符和水平製表符。而且,最後一行應該以一個換行符作為結束,並且任何一行都不能在換行符之前出現空格。
二進位制流
二進位制流是位元組序列,它們不作修改直接傳送。也就是說,當操作二進位制流時,I/O 函數不會翻譯任何控制字元。通過二進位制流方式寫入檔案的資料,在同一個系統中,可以原封不動地讀取出來。然而,在有些實現版本中,會在流尾端加上一些值為 0 的位元組。
二進位制流通常用於編寫二進位制資料(例如,資料庫記錄),而不將它轉換為文字。如果程式通過二進位制流來讀取一個文字檔案的內容,那麼程式中出現的文字就是其儲存時的形式,包括所在系統使用的全部控制字元。
在常見的 Unix 系統上,文字流和二進位制流之間沒有差別。