Linux檔案 標準IO概述

2021-08-07 16:24:43 字數 2700 閱讀 9416

標準i/o指的是ansi c中定義的用於i/o操作的一系列函式。只要作業系統安裝了c庫,就可以呼叫標準i/o。換句話說,若程式使用標準i/o函式,那麼源**無需進行任何修改就可以在其他作業系統上編譯,具有更好的可移植性。

除此之外,由於標準i/o封裝了緩衝區,使得在讀寫檔案的時候減少了系統呼叫的次數,提高了效率。在執行系統呼叫的時候,linux必須從使用者態切換到核心態,在核心中處理相應的請求,然後再返回使用者態。如果頻繁地執行系統呼叫則會增加這種開銷。標準i/o為了減少這種開銷,採取緩衝機制,為使用者空間建立緩衝區,讀寫時優先操作緩衝區,在必須訪問檔案時(例如緩衝區滿、強制重新整理、檔案讀寫結束等情況)再通過系統呼叫將緩衝區的資料讀寫實際檔案中,從而避免了系統呼叫的次數。

標準i/o的核心物件是流。當用標準i/o開啟乙個檔案時,就會建立乙個file結構體描述該檔案。我們把這個file結構體稱為「流」。標準i/o函式都是基於流進行各種操作的。

流的分類分為文字流和二進位製流兩種:

文字流:文字流是由字元檔案組成的序列,每一行包含0個或多個字元並以』\n』結尾。在流處理過程中所有資料以字元形式出現,』\n』被當做回車符cr和換行符lf兩個字元處理,即』\n』ascii碼儲存形式是0x0d和0x0a。當輸出時,0x0d和0x0a轉換成』\n』(!!!重要)

二進位製流:二進位製流是未經處理的位元組組成的序列,在流處理過程中把資料當做二進位制序列,若流中有字元則把字元當做ascii碼的二進位制數表示。』\n』不進行變換。

例如:2016在文字流中和二進位製流中的資料型別不同:

文字流:2016—->』2」0」1」6』—->50 48 49 54

二進位製流:2016–>數字2016—>0000011111010001

在linux/unix系統中,文字流與二進位製流沒有差異,但是在windows中稍有差異,所以標準c庫定義了兩種流。

在使用標準i/o操作檔案的時候,每個被程式使用的檔案都會在記憶體中開闢一塊區域,用來存放與檔案相關的屬性資訊,這些資訊存放在乙個file型別的結構體中,file型別的結構體是由系統定義的乙個結構體:

typedef

struct

file;

在標準i/o中,常用file型別的結構體指標file*來操作檔案。

在初學c語言檔案i/o相關知識點時,經常會陷入「什麼是流?」「什麼是檔案?」「流和檔案有什麼關係(區別)?」等問題。在這裡對「流」與「檔案」進行簡單的討論。《c primer plus》上說,c程式處理乙個流而不是直接處理檔案。但是後面的解釋十分抽象:『流(stream)是乙個理想化的資料流,實際輸入或輸出對映到這個資料流』。

本質上來說,檔案本身就是資料的有序序列,因此我們操作檔案時是按順序依次操作該檔案的資料。我們可以想象乙個傳送帶,傳送帶上的產品就是待運算元據。當我們對檔案內的資料進行操作時,已操作的資料從當前位置離開,待操作的資料不斷流向當前位置,這樣檔案內的資料就產生了流動的感覺,這個「傳送帶」就是c語言內「流」的原型。

我們開啟乙個流,就意味著將該流與該檔案進行了連線(即讓檔案內的「產品」放上「傳送帶」),關閉流將斷開流與該檔案的連線。此時我們對流進行操作就是對檔案進行操作。通常在不產生歧義的情況下,「檔案」與「流」可以不予區分。

在程式開始執行的時候,作業系統會預設開啟stdin、stdout、stderr三個檔案,這三個檔案作為輸入、輸出、輸出錯誤的流,這樣我們使用諸如scanf()、printf()等就無需手動載入流,方便使用。

當我們使用fopen()開啟乙個檔案的時候,該檔案會返回乙個file*型別的指標,例如:

file *fp = fopen(「hello.txt」,」w」)

此時檔案hello.txt與流指標fp就關聯了起來,對fp的操作就相當於對檔案hello.txt進行操作。

在標準i/o中預定義了三塊緩衝區:stdin、stdout、stderr,分別代表標準輸入流、標準輸出流、標準輸出錯誤流。見下:

流的名稱 程式中使用

標準輸入 stdin

標準輸出 stdout

標準錯誤輸出 stderr

標準i/o中的流的緩衝型別有三種:

1.全緩衝:這種情況下,當緩衝區被填滿後才進行實際的i/o操作。對於存放在磁碟上的普通檔案用標準i/o開啟時預設是全緩衝的。當緩衝區滿或者執行重新整理緩衝區(fflush)操作才會進行磁碟操作。

2.行緩衝:這種情況下,當在輸入/輸出中遇到換行符時執行i/o操作。標準輸入/輸出流(stdin/stdout)就是使用行緩衝。

3.無緩衝:不使用緩衝區進行i/o操作,即對流的讀寫操作會立即操作實際檔案。標準出錯流(stderr)是不帶緩衝的,這就使得當發生錯誤時,錯誤資訊能第一時間顯示在終端上,而不管錯誤資訊是否包含換行符。

示例1.1:stdout使用行緩衝形式

效果:不會立即列印內容,而是等待』\n』或者緩衝區滿才輸出。

#include

int main()

return

0;}

示例1.2:stdout使用行緩衝形式

效果:當新增了』\n』之後,會正確地輸出

#include

int main()

return

0;}

示例1.3:stderr使用無緩衝形式

效果:stderr使用無緩衝,即使不使用』\n』仍能立即輸出

#include

int main()

return

0;}

Linux檔案 檔案IO概述

posix portable operating system inte ce,可移植作業系統介面規範 標準最初由ieee institute of electrical and electronics engineers,電氣和電子工程師協會,是目前最大的全球性非營利性專業技術學會 制定,目的是提...

C標準庫I O和Linux檔案I O

c標準 i o庫函式在標頭檔案 stdio.h 中宣告,而 read write 等函式 檔案i o 在標頭檔案 unistd.h 中宣告 linux的訪問許可權分為 讀 寫 執行三種,可以使用ls l進行檢視 niesh niesh desktop ls lh 總用量 8.0k rw rw r 1...

檔案標準標準IO與檔案IO 的區別

首先宣告,我是乙個菜鳥。一下文章中出現技術誤導情況蓋不負責 先來了解下什麼是標準 以及檔案 標準 標準i o是ansi c建立的乙個標準i o模型,是乙個標準函式包和stdio.h標頭檔案中的定義,擁有必定的可移植性。標準io庫處理很多細節。例如快取分配,以優化長度執行io等。標準的io供給了三種型...