前言
檔案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開啟乙個文字檔案,以追加模式寫入檔案。如果檔案不存在,則會建立乙個新檔案。在這裡,您的程式會...