Linux初學第二天 檔案的寫入 讀取 關閉

2021-10-10 10:28:42 字數 3621 閱讀 5210

昨天已經學習了檔案的開啟及建立,及使用open函式,傳遞不同的引數可以實現檔案的開啟及建立,並賦予檔案的許可權,今天延續昨天的學習內容。

檔案的寫入及讀取都需要新增乙個標頭檔案:

#include
先說說檔案的寫入函式:write。

函式原型:ssize_t write(int fd, const void *buf, size_t count);

返回值:返回實際寫入資料的大小,如果count 的值遠遠大於buf的大小,返回的只有buf的 大小值。

說明:寫入 count個位元組的 buf給 fd描述符指向的檔案。

用法:把open開啟或建立的檔案的描述符傳給 write的 fd,並且定義乙個指標傳給 buf,count為buf的大小,可以用strlen()函式計算buf的大小。例如:

#include 

#include

#include

#include

#include

#include

#include

int main()

}

執行結果:

開啟了file之後:

再說說read函式

函式原型:ssize_t read(int fd, void *buf, size_t count);

返回值:返回讀取fd指向檔案的 count個位元組

說明:讀取fd指向的檔案的count個位元組的內容,存入buf

用法:把open的返回值(即fd檔案描述符)傳遞給read的fd,定義乙個指標來存放buf的內容,count賦值大小。

#include 

#include

#include

#include

#include

#include

#include

int main()

在程式中可以看到,我們在write之後並沒有直接read,那是因為read需要檔案內的 游標在我們所要讀取的內容之前(這裡為檔案的頭部),而write後的游標總是在檔案的尾部,所以直接在write之後讀取的話,不會讀取到內容,返回值為0。但是先關閉檔案(close)再開啟檔案(open)後,游標就在檔案的頭部,這樣才能正確的讀取。但是這個操作游標的方法不僅土得掉渣,還不靈活,這就需要游標操作函式 lseek()

函式原型:off_t lseek(int fd, off_t offset, int whence);

返回值:返回乙個相對於檔案頭的偏移值;

引數說明:

fd : 需要操作游標的檔案的描述符(非負整數);

offset :相對於whence的偏移值:負數——往前偏移、正數——往後偏移;

whence :游標的位置設定:seek_set 檔案頭部、seek_end檔案尾部、seek_count當前位置。

用法:在fd指向的檔案中,游標從whence的位置,往前或者往後偏移offset個位元組。

#include 

#include

#include

#include

#include

#include

#include

int main()

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

lseek

(fd,-6

,seek_end);

//從尾部向前偏移6個位元組

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

char *read_buf;

read_buf=

(char *

)malloc

(sizeof

(char)

* n_write+1)

; int n_read=

read

(fd,read_buf,n_write)

;printf

("read %d byte to file,%s\n"

,n_read,read_buf)

;close

(fd)

;return0;

}

也可以利用lseek函式來計算檔案的大小,這麼用:

int n_offset=

0;n_offset=

lseek

(fd,0,

seek_end);

//

因為lseek的返回值是相對於檔案頭的偏移值,所以lseek從頭部到尾部的偏移值就算出來了。

函式原型:int close(int fd);

說明:關閉fd指向的檔案;

當我們從open到write/read,後一定要用close來關閉檔案,這樣才完成操作檔案的基本流程,也防止程式出錯及檔案丟失。至於為什麼,這涉及到檔案操作的原理。

1.檔案描述符是乙個非負整數,當開啟乙個現存的檔案或建立乙個新檔案時,核心會向程序返回乙個檔案描述符,當讀寫乙個檔案時,用open()或者creat返回的檔案描述符標識該檔案,作為引數傳遞給write和read。

2.在unix shell中,檔案描述符有3個已經定義的巨集,它們分別替代了0、1、2:

stdin_fileno: 替代了 0 :為標準輸入檔案,傳遞給read的時候,可以獲取鍵盤的輸入,作用相當於scanf;

stdout_fileno: 替代了 1:為標準輸出檔案,傳遞給write 可以列印輸出,相當於printf;

stdrr_filene: 替代了 2 :為標準錯誤檔案,以後可以用來作錯誤提示。

這就解釋了為什麼我們在建立檔案的時候,檔案描述符總是先從3開始。

3.檔案描述符的作用域是當前的程序,出了這個程序後,這個檔案描述符就沒有意義了,也就是說這個檔案描述符不起作用了。

靜態檔案存於磁碟當中,比如我們電腦桌面的資料夾,就屬於靜態檔案。

當我們open乙個靜態檔案之後,linux核心會產生乙個結構體來描述這個檔案,結構體當中可能檔名,檔案大小、檔案內容等元素;而其中的檔案內容就是我們在使用 write 或者read所操作的檔案,就是動態檔案。它在close(關閉檔案 )之前會存放在記憶體當中,直到執行close之後,才會存放在磁碟當中,變成靜態檔案。這就是為什麼我們在write/read之後要close的原因。

js初學第二天

自動登入 不要在網咖 2.tostring 把其他的型別轉換為string null和undefined 沒有tostring 方法 注意 字串和數字放一起進行運算,會自動由字串轉為數字進行運算,號會把字串裡的數字 自動轉換為number型。string 有參函式 null null undefin...

自學Linux第二天

eclipse 執行程式 後台執行 當前目錄 上級目錄 cat etc group檢視使用者組 cat etc passwd檢視所有使用者資訊 mount mnt掛載目錄 unmount mnt解除安裝目錄 setup配置系統相關 mv 原檔名 新檔名檔案改名 rwxrw r 第2 4位 所屬使用者...

linux第二天總結

今天一開始就在linux系統中遨遊,領略各種風景 pwd 顯示當前目錄 cd 進入目錄 vim vi 編輯檔案 ls或ls l ll 列出當前系統的檔案及資料夾 date 顯示時間 cal 顯示當前月份的日曆 cal year 顯示某一年的日曆 bc 計算器 scale number可以顯示出小數點...