C語言中文網 目錄

C語言文本流和二進制流

從 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 系統上,文本流和二進制流之間沒有差別。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo