對外的輸入與輸出 檔案IO

2021-09-27 06:26:46 字數 2821 閱讀 8130

前言

檔案io是作業系統對外封裝的一組使用者使用的系統函式,他不在檔案快取系統之中在所有io操作過程是中沒有快取區的存在,他是由檔案描述符呼叫的,同時檔案描述符是從3開始前面的分別是stdin(標準輸入),stdout(標準輸出),stderr(無快取)

檔案io和標準io區別的再理解

標準的io的效率更高,因為他存在快取區

區別在於,檔案io的響應速度快,標準io的吞吐量大

標準io和檔案io不可混用

轉換函式 fileno fdpoen 可以將標準io轉換為檔案io

檔案io的開啟

#include #include #include
開啟函式

int open (const char *pathname,int flags)

功能是可以指定方式開啟指定路徑+檔案的名稱的檔案

flags 開啟檔案的方式

o_rdonly 唯讀

o_weonly 只寫

0_rdwr 讀寫

要求檔案必須存在

返回值:成功 返回檔案描述符 失敗 -1

同時乙個程序最多同時開啟1024個檔案

檔案描述符他其實就是乙個陣列的下標,每開啟乙個檔案,就有乙個目前最小的檔案描述符被使用,同時它預設開啟3個檔案描述符,他的範圍是0~1023

0 標準輸入

1 標準輸出

2 標準錯誤

同時還有很多巨集在man手冊中使用 同時在使用o_creat的時候,系統會有乙個掩碼,會幫你刪掉其他使用者的可執行許可權

比如你給的是666 ---- rw-rw-rx-之後就會變成 664 ----- rw-rw-r–

關閉函式

#include

int close (int fd)

功能:用來關閉指定檔案描述符

但是這個和標準io不同的是,這個可以關多次,不會造成記憶體洩漏

返回值 成功 0 失敗 -1

檔案io的讀取

#include

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

功能:通過該函式可以從fd指定的檔案中獲取長度為

count位元組的資料到buf所在的本地記憶體。

引數:fd 要讀資料的檔案描述符。

buf 用來儲存讀到的資料。

count 控制讀的資料長度,單位位元組。

返回值:成功 返回獲取到的資料長度,一般小於等於count

失敗 -1

檔案結尾 0

其中 ssize_read 是無符號int型別,如果要列印他的數需要使用%zd

如果使用的read函式來獲得標配輸入的,可以將檔案描述符改為0;及標準輸入stdin

檔案io的寫入

ssize_t write(int fd, const void *buf, size_t count);

功能:向指定的fd檔案中寫入長度為count位元組的資料。

引數:fd 檔案描述符

buf 要寫入檔案的資訊。

count 要寫入檔案的資料長度,單位位元組。

返回值:成功 返回寫入的資料長度

失敗 -1

檔案定位操作

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

功能:在fd所在的檔案中移動其檔案指標到指定位置。

引數:fd 要移動檔案指標的檔案描述符

offset 移動的偏移量,> 0 向檔案末尾偏移

< 0 向檔案開頭偏移

= 0 檔案指標不動

whence 移動的起始位置,有如下三個巨集。

seek_set 檔案開頭位置

seek_cur 檔案當前位置

seek_end 檔案末尾位置

返回值:成功 返回移動後指標距離檔案開頭位置的位元組數。

失敗 -1

他不會出現像fseek中偏移越過尾會出現空洞檔案,也不會在偏移越過頭導致失敗

open的其他操作:

強制位和黏滯位

強制位:在擁有者或擁有組的可執行許可權上再加乙個s

如果檔案上有s,那他就可以給任何乙個使用者,都以檔案的擁有者來使用

在執行檔案擁有者的許可權

黏滯位:在其他使用者的可執行許可權上加乙個t

一般用在共享檔案上,任何人都可以新增和刪除自己的檔案,沒有去許可權修改別人的,但是root使用者除外

如果在可執行的檔案上顯示的是大寫的s或t的話,就表示檔案沒用可執行的許可權,這時候s和t就沒用意義

擁有者 s 100 4

擁有組 s 010 2

其他使用者 t 001 1

例子:

rwsrwxrwx 4777

rwxrwsrwt 3777

--s--s--t 7111

4 2 1

--s--s--t 7000

4 2 1

檔案許可權本質上是四個8進製數

.1強制位,粘滯位

.2擁有者許可權

.3擁有組許可權

.4其他使用者許可權

int dup(int oldfd);

可以理解為複製乙份檔案描述符,使得兩個檔案描述符都指向同乙個檔案,占用的是最小的描述符,如果失敗,返回-1,並且設定errno

在多程序和對執行緒的地方,最好不要使用,因為他不是乙個原子操作

int dup2(int oldfd, int newfd); //檔案描述符的重定向

檔案描述符的重定向重定向到另乙個檔案描述符上,並且會關閉之前的檔案,返回的是新的檔案描述符,失敗返回-1,並設定errno

將 oldfd 用 newfd代替

輸入輸出檔案的定位

對輸入流操作 seekg 與tellg 對輸出流操作 seekp 與tellp seekg 是對輸入檔案定位,它有兩個引數 第乙個引數是偏移量,第二個引數是基位址。ios beg 表示輸入流的開始位置 ios cur 表示輸入流的當前位置 ios end 表示輸入流的結束位置 ifstream in...

檔案輸入輸出I O

file主要用於在磁碟上讀寫檔案 1 在程式中,用file和jfilechoose讓使用者定義或者指定乙個檔案 2 在檔案中,用fileoutputstream和fileinputstream讀寫位元組 3 在檔案中,用dataoutputstream和datainputstream讀寫原始資料型別...

檔案輸入輸出(IO)

模式描述 r開啟乙個已有的文字檔案,允許讀取檔案。w開啟乙個文字檔案,允許寫入檔案。如果檔案不存在,則會建立乙個新檔案。在這裡,您的程式會從檔案的開頭寫入內容。如果檔案存在,則該會被截斷為零長度,重新寫入。a開啟乙個文字檔案,以追加模式寫入檔案。如果檔案不存在,則會建立乙個新檔案。在這裡,您的程式會...