c語言檔案IO庫函式 APUE學習筆記 1

2021-07-07 07:45:24 字數 3336 閱讀 5463

檔案描述符時乙個非負整數(0~open_max - 1).當開啟現有檔案或者建立新檔案時,核心向程序返回乙個檔案描述符一邊標示乙個檔案。

核心檔案描述符要區別於shell檔案描述符:shell內定了幻數0, 1, 2分別表示標準輸入,標準輸出和標準錯誤。

1.open或openat:

(1). 開啟檔案,成功返回檔案描述符,失敗返回-1.

#include 

int open(const char *path, int oflag, ... /*mode_t mode */);

int openat(int fd, const char *path, int oflag, ... /*mode_t mode */);

(2). 引數:
a. path表示檔案路徑;

b. oflag用來說明該函式的多個選項,如:o_rdonly, o_wronly, o_rdwr分別表示唯讀,只寫和可讀寫,而o_creat選項表示當開啟檔案不存在時建立這個檔案,o_directory選項表示如果path應用的不是目錄則出錯。這些選項都可以通過man page查詢獲得。

c. …引數:iso c用這種方法表示剩餘引數為可變引數,即在需要時可以變參。

(3). 檔案描述符fd引數將open和openat區分開來:
a. 當path指定的為絕對路徑時,fd引數被忽略,兩函式相等。

b. 怕path指出相對路徑名時,fd引數相對路徑名在檔案系統中的開始位址。fd引數是通過開啟相對路徑名所在的目錄來獲取的。

c. path引數指定了相對路徑名,fd引數具有特殊值at_fdcwd。在這種情況下路徑名在當前工作目錄中獲取,openat和open類似。

2.creat

(1). 建立只寫檔案,成功返回只寫檔案描述符,失敗返回-1.

#include 

int creat(const

char *path, mode_t mode);

此函式等效於:

open(path, o_rdwr|o_creat|o_trunc, mode);
(2). 引數:
a. path為路徑

b. mode為許可權模式

(3). creat函式只能以只寫方式開啟所建立的檔案。早期版本中使用該函式,現在多用open函式代替
open(path, o_rdwr|o_creat|o_trunc, mode);
3.close

(1). 關閉檔案,成功返回0,出錯返回-1.

#include 

int close(int fd);

(2). 當檔案關閉同時會釋放所有加在該檔案上的記錄鎖。

(3). 當乙個檔案終止時,核心會自動關閉它所開啟的所有檔案。所以close函式一般不現式使用。

4.lseek

(0). 檔案偏移量:通常是乙個非負整數,用以度量從檔案開始處計算的位元組數。

#include 

off_t lseek(int fd, off_t offset, int whence);

(1). 設定檔案偏移量,成功返回返回新的檔案偏移量,失敗返回-1.

(2). 引數:

a. offset引數解釋和whence值有關:

-> whence為seek_set時,檔案偏移量將被設為距檔案開始offset個位元組。

-> whence為seek_cur時,檔案偏移量將被設為當前偏移量加上offset(offset正負都可)。

-> whence為seek_end時,檔案偏移量將被設為檔案長度加offset(offset正負都可)。

(3). 管道,fifo, 網路套接字不可設定偏移量,若對其操作,返回-1,errno為espipe。

(4). 一般情況檔案的偏移量為乙個非負整數,但是某些特殊裝置時允許負的偏移量的,so~,判斷檔案偏移量是否設定成功應該看看他的lseek返回值是否為-1,而不是判斷它是不是負數。

(5). lseek僅僅時將檔案偏移量記錄在核心中,他本身並不引起io操作,這個偏移量的存在只是給下一次的讀和寫操作的。

(6). 檔案空洞:檔案偏移量時可以大於檔案當前長度的,這樣如果得到偏移量後的執行一次寫操作,寫的位置和檔案開頭就存在了一片空白區,這段區域被字元0填滿,稱之為空洞,(空洞不要求占用磁碟儲存區)。

5.read

(1). 讀檔案,返回讀到的位元組數,弱國已經讀到檔案末尾了,則返回0,失敗返回-1。

#include 

ssize_t read(int fd, void *buf, size_t nbytes);

(2). 在下述情況下,函式實際讀到的位元組數少於要求讀到的位元組數。
a. 要求讀的大小大於檔案本身大小時:

在還沒讀到檔案要求大小時檔案已經讀到末尾了.例如:如檔案只有30位元組,而要求 讀100位元組,這樣read函式將返回30,下次呼叫read時它將返回0.

b. 從終端讀裝置讀時:

一次唯讀一行,和標準輸出按行重新整理對應.

c. 從網路讀資料時:

網路快取機制導致返回值小於要求讀的大小.

d.從管道讀取資料時:

返回實際管道可用資料.

e. 從面向記錄裝置讀時:

一次只能讀一條記錄.

f. 讀過程中遇到訊號中斷時:

返回實際讀到的資料.

g. 返回值型別(ssize_t)為帶符號整數:

為確保函式可以返回正整數位元組,0(到檔案尾),-1(出錯).

6.函式write.

(1). 寫入函式,向檔案描述符為fd的已開啟檔案中寫資料,成功返回寫入位元組數,出錯返回-1.

(2). write函式的返回值通常與nbytes值相同,否則表示出錯.

(3). 出錯原因常見為:

a.磁碟已滿.

b.超過給定程序的檔案長度限制.

(4).普通檔案執行寫使用write時,寫操作是從檔案當前偏移量處開始.

例:用read和write函式實現簡單函式複製:

#include 標頭檔案中包含有write,read以及基本操作標頭檔案

#define buffsize 4096

int main(int argc, char **argv)

}//read函式返回-1時,輸出錯誤資訊並退出

if(n < 0)

exit(0);

}

檔案I O之C標準庫函式和系統庫函式差別

1.首先c標準庫函式是工作在系統庫函式之上的。c標準庫函式在讀寫檔案時候都有乙個檔案流指標。file fp null fp fopen f path,r fp檔案流指標,其指向結構體例如以下圖所看到的。檔案描寫敘述符指向磁碟檔案。在進行檔案讀寫操作時候是先讀寫到緩衝區。然後再呼叫系統應用層api w...

c語言庫函式

1 asll可現實字元 include library.h u8 lib int2string u32 number,u8 char s char s i 0 for j 0 j i 2 j return i description 初始化記憶體函式,以位元組為單位 param in pdst 目標...

C語言庫函式

定義 庫函式 顧名思義是把函式放到庫里,是別人 或組織 把一些常用到的函式編完放到乙個檔案裡,供程式設計人使用,程式設計人用的時候把它所在的檔名用 include 加到裡面就可以了 尖括號內填寫檔名 例如 include。簡介 c語言是一種非常優秀的程式設計的入門語言。它比其他大部分語言都簡潔易學,...