1. 程式人生 > >5Apue標準IO庫

5Apue標準IO庫

1、流和FILE物件

之前提到的檔案IO函式都是圍繞檔案描述符
而對於標準庫,它們的操作是圍繞進行的,當用標準IO庫開啟或建立一個檔案時,我們已使一個流與一個檔案相關聯

標準IO檔案流可用於單位元組或多位元組字符集。
流的定向決定了所讀、寫的字元是單位元組還是多位元組。
當一個流被建立時,它並沒有定向。在它上面使用一個多位元組的IO函式,則該流的定向設定為寬定向的。否則單位元組的IO函式對應是位元組定向的。
只有兩個函式可以改變流的定向

1)fwide函式:用於設定流的定向

在這裡插入圖片描述
引數:
mode為負則fwide將試圖設定流是位元組定向
mode為正

則fwide將試圖設定流是寬定向
mode為0則fwide將不試圖設定流的定向,但返回標識該流定向的值。若流是寬定向則返回正值,位元組定向返回負值,未定向返回0。
注意:
fwide並不改變已定向的流,且無出錯返回
舉例:
int res = fwide(stdin, 1); //設定標準輸出為寬定向,返回一個正值

2、標準輸出、標準輸出和標準錯誤

1。對一個程序,預定義了3個流,並且這3個流可以自動被程序使用:標準輸入、標準輸出和標準錯誤,這3個流引用的檔案與3個檔案描述符所引用的相同
2。這3個標準IO流通過預定義檔案指標stdin、stdout、stderr加以引用

3、緩衝

1。重點:標準IO庫提供緩衝的目的是儘可能減少使用read和write呼叫的次數
2。標準IO提供了下面3中型別的緩衝:

  • 全緩衝:在填滿標準IO緩衝之後才進行實際IO操作
  • 行緩衝:當在輸入和輸出遇到換行符時,標準IO庫才執行IO操作,行緩衝的兩個限制:①每一行的緩衝區長度是固定的,只要填滿了緩衝區,即使還沒寫一個換行符,也進行IO操作。②只要通過標準IO庫要求從一個不帶緩衝的流或者一個行緩衝的流得到輸入資料,那麼就會沖洗所有行緩衝輸出流
  • 不帶緩衝:標準IO庫不對字元進行緩衝儲存。例如標準IO函式fputs、標準錯誤流stderr。這使得資訊可以儘快顯示出來,而不管它們是否有換行符

3。更改緩衝:
在這裡插入圖片描述
對於一個給定的流,如果不希望它是預設的(系統預設流被開啟時是全緩衝的,若流引用終端裝置則該流是行緩衝的),可以通過setbuf或setvbuf來更改緩衝型別,這兩個函式一定要在流已被開啟後,在對該流執行操作之前呼叫
其中,setbuf用來開啟或關閉緩衝機制
setvbuf可以通過mode來精確指定所需的緩衝型別
在這裡插入圖片描述
4。沖洗一個流
在這裡插入圖片描述
該函式使流所有未寫的資料都被傳送至核心。若fp是NULL,則此函式將導致所有輸出流被沖洗。

4、開啟和關閉流

在這裡插入圖片描述
引數mode:
在這裡插入圖片描述

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]) { 
	FILE *fp = NULL;
	fp = fopen(argv[1], "r");
	if (fp == NULL) {
		perror("fopen() error!\n");
		exit(1);
	}
	fclose(fp);
	fp = NULL;
	return 0;
}

區別:

  • fopen開啟路徑名為pathname的一個指定檔案
  • freopen在一個指定的流上開啟一個指定檔案。若該流已開啟,則先關閉該流。若該流已定向,則先清除該定向。一般用於將一個指定的檔案開啟為一個預定義的流:標準輸入、標準輸出、標準錯誤
    在這裡插入圖片描述
  • fdopen取一個已有的檔案描述符,並使一個標準IO流與該描述符相結合。

關閉一個開啟的流:
在這裡插入圖片描述
在該檔案被關閉之前,沖洗緩衝中的輸出資料。緩衝區無論什麼輸入資料都被丟棄。如果標準IO庫已為該流自動分配了一個緩衝區,則釋放此緩衝區。
當一個程序正常終止時(exit或從main返回),則所有帶未寫緩衝資料的標準IO流都被沖洗,所有開啟的標準IO流都被關閉

5、讀和寫流

一旦打開了流,則可在3中不同型別的非格式化IO中進行選擇,對其進行讀寫操作:

1。每次一個字元的IO:

一次讀或寫一個字元,如果流是帶緩衝的,則標準IO函式處理所有緩衝
在這裡插入圖片描述
返回值:
成功則返回下一個字元。若已達到檔案末尾或出錯,則返回EOF(在<stdio.h>中,一般是一個負值-1)為了區別這兩種情況,要呼叫ferror或feof
在這裡插入圖片描述
clearerr函式可以清除上面的兩個標誌

2。每次一行的IO:

一次讀或寫一行,每行都以換行符終止
在這裡插入圖片描述

3。直接IO:

fread和fwrite函式支援這種型別的IO