標准輸入輸出



記錄下,了解概念。

描述程序與文件連接

  • 文件描述字

  • 系統中關於I/O的函數也分為兩大類:文件描述子操作,流操作。

當用流或文件描述字I/O函數打開一個文件時,分別返回一個流或文件描述字,后面就可以將這個流或文件描述字作為參數交給相應讀寫函數來完成實際的讀寫操作。通過關閉文件可以終止程序與文件的連接。

文件描述字與流

文件描述字表示為int類型的對象,流表示指向類型為FILE結構的指針。文件描述字多數是系統調用,提供底層基本的輸入輸出操作接口。

流函數建立在文件描述字之上,通過文件描述字函數而實現,給程序提供更高一級的輸入輸出接口。流函數比對應的文件描述字函數更豐富,功能更強大,也更利於程序的移植。

一般情況下,堅持使用流函數,系統基本支持流函數,而不是所有系統支持文件描述字。除非做些特殊操作,而此操作只能使用文件描述字,如需要對特定設備進行控制操作,非阻塞輸入等。

流和FILE對象

流的數據類型是FILE類型。FILE對象由標准I/O庫函數內部分配和管理,用戶無需自己創建FILE類型對象,無須查看FILE對象內容,調用標准I/O庫函數即可,如fopen()打開或創建一個流時,它會返回一個指向FILE結構的指針,此時程序和文件之間建立了一個流。

標准流

UNIX系統中每個進程都有三個預先定義並自動打開的流,stdin,stdout,stderr。這三個標准流在< stdio.h >中說明,分別代表標准輸入、標准輸出和標准錯誤輸出。

打開和關閉流

三個函數
image

freopen()重新打開pathname指定的文件,作用類似於fclose()和fopen()的合並。

讀和寫流

打開一個流,就可以對其進行讀寫。使用I/O函數:
如:字符I/O
每次讀入一個字符:
image
輸出單字符:
image

其它函數不做細究。

流緩沖

每一個流都有一個輸入輸出緩沖區。寫入流的字符並不立即寫到文件中,而是現在緩沖區中聚集為一塊,然后異步地以塊為單位傳送到文件。

目的:減少調用低級I/O函數(如read(),write())的次數,因為真正讀寫文件的函數是系統調用,它們是較費時間的操作。

舉例:
對於存儲在硬盤上的文件,當進
程用read或 write(讀寫數據時,設備驅動程序必須將數據在文件中的地址轉換成硬盤的物理磁
道號、卷宗號以及扇段號。之后設備必須移動磁頭至相應的卷宗並等待磁盤的相應扇段旋轉至
磁頭之下。一切准備好了之后才能從磁盤開始讀寫數據。顯然,每讀寫一個或幾個字符便導致
執行這一串的動作是極不合算的。利用緩沖處理則不必為每讀寫一個字符而頻繁地與外部設備
打交道,同時還可以實現異步IO,即在CPU運行程序的同時從外設傳輸數據,從而提高輸入輸出的效率。

流有三種緩沖類型:

  • 全緩沖 磁盤文件一般是全緩沖
  • 行緩沖 一般用於終端之類交互設備的流
  • 無緩沖 不設置緩沖區。

UNIX對新打開的流采用如下默認緩沖類型:

  • 標准錯誤劉總是無緩沖的。 盡快返回錯誤
  • 其他的流若引用交互設備則是行緩沖的,否則是全緩沖。
    這是自動默認,使用時也可自己設定。
    image

格式輸出

image

格式輸入

image

思考:

  1. 打開文件的實質是什么?
  2. 從應用的角度看,UNIX系統中程序與文件建立連接有幾種機制?流與文件描述字有什么
    區別?
  3. 什么是文件位置?它起什么作用?
  4. 系統為每一個進程自動打開的輸入輸出流有哪些?它們對應的名字是什么?
  5. 寫“r”方式打開的文件會發生什么情況?讀“w方式打開的文件呢?建議你編寫一個這樣
    的程序試試。
  6. 按讀寫數據的粒度分,有幾類流輸入輸出函數?
  7. 說說PHP關於緩沖區的處理。

參考:
php緩沖區詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM