流和檔案的區別

2021-07-05 15:21:30 字數 1301 閱讀 1638

前面介紹的linux下的檔案程式設計所涉及的操作方式都是不帶緩衝的i/o,因為每次呼叫相應的函式比如說read、write等對檔案進行操作的時候都會呼叫核心的系統呼叫,由於每次都要通過核心對檔案進行操作,所以操作效率比較低,對於流程式設計來說,首先對檔案所對映的流進行操作,然後分階段將相應的資料寫入檔案,極大地提高了相應的操作效率。linux也提供了很多流操縱庫函式,稱為標準i/o庫,是iso c的組成部分。

檔案的i/o函式都是針對檔案描述符進行操作的,比如說當呼叫open或者其他函式開啟乙個檔案,返回乙個檔案的描述符fd,然後針對這個fd進行後續的i/o操作,由於需要多次反覆呼叫對應的系統呼叫,效率低是自然的。

而流i/o函式的操作是圍繞流(stream)進行的,當使用流i/o庫開啟或者建立乙個檔案時,可以使乙個流和乙個檔案結合,接下來的操作就是對流進行讀寫、定位等,最後關閉即可。

上圖可以看出流和檔案,帶緩衝和不帶緩衝是相對而言的。對於不帶緩衝的檔案i/o操作也不是直接對檔案進行的,只是在使用者空間沒有緩衝區,所以是不帶緩衝的i/o,但是對於linux核心來說,還是進行了緩衝。當使用者呼叫不帶緩衝的io函式寫資料到檔案時,即對磁碟儲存區進行讀寫,linux核心會先將資料寫入到核心中的緩衝儲存區。比如說,緩衝儲存區的長度是50位元組,呼叫write函式進行寫操作時,如果每次寫入10個位元組,則需要呼叫5次write函式,而此時資料還是在核心的緩衝區中的,並沒有寫入到磁碟。當50個位元組已經寫滿的時候才進行實際的io操作,把資料寫入到磁碟中。

帶緩衝的io則是在使用者空間中建立了另外乙個緩衝區,即流緩衝區,假設流緩衝區的長度也是50個位元組,當呼叫對應的寫入庫函式時會將資料寫入到這個流快取裡面,然後再一次性進入核心快取區,此時再使用系統呼叫將資料寫入到檔案,從而減少了系統呼叫

總之,對於不帶緩衝的i/o,將資料寫入磁碟的過程是:資料→核心緩衝區→磁碟;而對於帶緩衝的i/o其過程是:資料→流緩衝區→核心緩衝區→磁碟

流操作函式物件不是檔案描述符,而是乙個流緩衝區。當開啟乙個流時,返回乙個指向file物件的指標。該物件是乙個結構體,包含了管理這個流所需要的所有資訊,比如說用於實際i/o的檔案描述符、指向流快取的指標、快取的長度、當前快取中的字元數、出錯標誌等。在實際的應用中,使用者只需要知道為了引用乙個流,需要將file指標作為引數傳遞給對應的函式即可。使用者可以簡單地把流看做一塊由作業系統分配的記憶體緩衝區,在該緩衝區中存放了檔案對應的資料。

檔案和檔案流

12.1 c 檔案流的基本概念 12.1.1檔案及及分類 1.程式檔案 包括源程式檔案 字尾名.cpp 目標檔案 字尾為.obj 可執行檔案 字尾名.exe 這類檔案包含的是文字和二進位制程式 2.資料檔案 檔案的內容不是程式,而是供程式讀寫的資料。12.1.2 c 檔案流基礎 1.ifstream...

文件流和文字流的區別

1.文件流是指html文件載入解析時從上到下,從左向右,但相對於盒子模型來說,浮動後脫離文件流,但是沒有脫離文字流。1.1 doctype html html head meta charset utf 8 title document title style test01 style head b...

載入樹和檔案流

private void loadtree string path,treenode node else 如果不是null 就將節點載入到傳進來的節點下面.if directory.getdirectories dir length 0 判斷當前遍歷到的目錄下面是否還有子目錄.private voi...