目錄文件IO知識點補給1.FAT32與NTFS文件系統的區別?2.MMU的概述和作用3.簡述Linux系統內核的作用4.瞭解Linux系統目錄和文件夾的區別標準IO介面一、打開文件函數1:fopen二、讀取數據(1)字元讀取函數2:fgetc函數3:getc函數4:getchar(2)按行讀取函數5 ...
目錄
文件IO
知識點補給
1.FAT32與NTFS文件系統的區別?
答:NTFS和FAT32是兩種不同的文件系統格式,它們在功能、安全性和性能等方面存在一些區別。
1、功能和性能:NTFS是一種高度可恢復的文件系統,具有許多高級功能,如數據恢復、加密、壓縮、磁碟配額等。相比之下,FAT32文件系統在功能和性能方面較為有限。
2、磁碟分區大小:NTFS支持的磁碟分區大小最大可達2TB(2048GB),而FAT32支持的分區大小最大為32GB。因此,對於需要使用大容量磁碟的用戶來說,NTFS是更好的選擇。
3、單個文件大小:NTFS突破了單個文件4GB的容量限制,目前來說似乎沒容量限制,只要硬碟空間容量有多大,那麼就NTFS就可以分到多大。而FAT32在實際運行中不支持單個文件大於4GB的文件,一旦超過容量限制那麼系統就會提示磁碟空間不足。
4、安全性:NTFS提供了更高級的安全功能,可以對文件和文件夾進行加密和許可權設置,而FAT32則不具備這樣的安全功能。在NTFS下,用戶可以對電腦用戶對該格式下所有的文件夾、文件進行加密、修改、運行、讀取目錄及寫入許可權的設置。此外,在磁碟分區下任意文件夾或文件上右鍵屬性,在高級屬性視窗中勾選中加密內容以便保護數據即可做到加密。
5、碎片和空間利用:隨著時間的推移和使用次數的增加,文件可能會產生碎片。從FAT16的文件系統格式,到之後的FAT32然後再到現在的NTFS文件系統格式,從磁碟分區的格式不同,那麼所產品的磁碟碎片也是越來越小。
6、磁碟配額:NTFS支持磁碟配額,可以在一個NTFS分區上為不同用戶設置不同的磁碟空間配額,而FAT32不支持磁碟配額。
7、文件恢復:NTFS具有更好的文件恢復功能,可以恢復意外刪除或格式化的文件,而FAT32的文件恢復功能相對較弱。
8、壓縮和加密:NTFS支持文件和文件夾的壓縮和加密,而FAT32不支持。
9、日誌記錄:NTFS支持事務日誌記錄,可以記錄對文件系統的更改,而FAT32不支持。
10、文件鏈接:NTFS支持硬鏈接和符號鏈接,而FAT32不支持。
11、文件訪問控制:NTFS支持更複雜的文件訪問控制,可以針對不同用戶或用戶組設置不同的訪問許可權,而FAT32不支持。
12、安全性:NTFS具有更高的安全性,可以防止惡意軟體或黑客對文件進行修改或刪除,而FAT32的安全性相對較低。
綜上所述,NTFS和FAT32在功能、性能、磁碟分區大小、單個文件大小、安全性和碎片和空間利用等方面存在顯著差異。因此,在選擇文件系統格式時,需要根據實際需求和使用場景進行選擇。如果需要使用大容量磁碟並需要高級安全功能和數據恢復能力,則建議使用NTFS文件系統。如果只需要一個簡單的文件系統用於存儲少量數據,並且不需要高級功能,則FAT32文件系統可能是一個更好的選擇。
2.MMU的概述和作用
MMU(Memory Manager Unit),中文名是記憶體管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的記憶體訪問授權,多用戶多進程操作系統。
- 1 虛擬地址到物理地址的映射。MMU負責將應用程式生成的邏輯地址(虛擬地址)轉換為物理地址,這使得程式可以使用比實際物理記憶體更大的地址空間。
- 2 記憶體保護。通過設置訪問許可權位,MMU可以保護記憶體區域,防止程式訪問或修改關鍵數據。例如,它可以標記某些記憶體區域為只讀或禁止訪問。
- 3虛擬記憶體管理。MMU實現了虛擬記憶體的概念,允許每個進程認為自己擁有整個物理記憶體,而實際上物理記憶體可能被多個進程共用。它負責將進程的虛擬地址映射到物理記憶體,以便多個進程能夠同時運行而不會相互干擾。
- 4存儲器訪問許可權的控制。MMU可以控制對存儲器的訪問許可權,包括讀寫許可權。
- 5設置虛擬存儲空間的Cache特性。MMU可以設置虛擬存儲空間的緩存特性,以提高數據訪問的速度和效率。
- 6處理頁面缺失和頁面替換演算法。MMU通過TLB(Translation Lookaside Buffer)來加速虛擬地址到物理地址的轉換,如果發生TLB缺失,MMU會使用頁面替換演算法來處理頁面替換,以保持物理記憶體的有效使用。
總的來說,MMU是現代電腦系統中的重要組成部分,它通過虛擬記憶體管理、記憶體保護和地址映射等功能,極大地提高了電腦系統的記憶體管理效率和安全性。
3.簡述Linux系統內核的作用
Linux內核的功能主要是將應用層請求傳遞給硬體,並作為底層驅動程式,以間接控制定址系統中的各種設備和組件。
- 1.進程管理:Linux內核負責管理系統中運行的進程,包括進程的創建、調度、銷毀等操作,確保進程能夠正確地運行並共用系統資源。
- 2.文件系統管理:Linux內核提供文件系統的支持,包括文件的讀寫、許可權管理、文件系統的掛載等操作,使得應用程式能夠方便地訪問和操作文件。
- 3.網路管理:Linux內核提供網路協議棧的支持,包括TCP/IP協議、網路設備驅動等,使得電腦能夠進行網路通信。
- 4.記憶體管理:記憶體資源的使用策略對操作系統性能體現來說,尤為重要。記憶體在有限的記憶體資源上,為每一個進程建立了一個虛擬地址空間。內核的不同功能部分與記憶體管理子系統通過一套函數調用交互,使得通信高效簡單。
4.瞭解Linux系統目錄和文件夾的區別
Linux中的目錄與Windows中的文件夾的含義是很容易混淆的,錶面 上好像一致,實則不然。
- Windows中的文件夾類似於一種容器,大文件裡面存放了很多文件以及子文件,子文件裡面又嵌套有別的文件夾,一層套一層,就好比俄羅斯套娃,不管怎麼套,裡面的總比外面的小,故在Windows中子文件是不可能比外部文件還大的。
- Linux中的目錄並不是一種容器,而僅是一個文件索引表,目錄下的文件的真正的內容存儲在分區中的數據域區域。目錄中索引表的每一項稱為“目錄項”,裡面至少存放了一個文件的名字(不含路徑部分)和索引號(分區唯一)。
標準IO介面
一、打開文件
函數1:fopen
- 頭文件:
#include<stdio.h>
- fopen函數的功能:
獲取指定文件的文件指針。 - fopen函數作用的整體流程:
用戶可以在一個程式中利用fopen函數打開多個文件,每次打開一個文件,內核就會從堆記憶體中申請一塊FILE結構體大小的空間用來存儲文件的所有信息,然後按照文件打開的順序把每個打開的文件的結構體形成一條鏈表,然後使用鏈表頭進行管理。 - 函數原型:
FILE*fopen(const char *pathname,const char *mode);
- 函數參數:fopen有兩個參數
參數一:const char *pathname:指的是打開文件的路徑,需要字元串,例如 “demo.txt”,註意有具體文件名的話,即固定文件,需要加“ ”。
參數二:const char *mode:指的是訪問文件的許可權。
參數二選擇項如下:
r:以只讀方式打開文件,要求文件必須存在,游標在文件開頭
r+:以可讀可寫方式打開文件,要求文件必須存在,游標在文件開頭
w:以只寫方式打開文件;如果文件不存在則會創建新文件,如果存在文件則會將其內容清空;游標在文件的開頭。
w+:以可讀可寫方式打開文件;如果文件不存在則會創建新文件,如果存在文件則會將其內容清空;游標在文件的開頭。
a:以只寫方式打開文件;如果文件不存在則會創建新文件;游標在文件的末尾,意味著以追加的方式寫入內容。
a+:以可讀可寫方式打開文件;如果文件不存在則會創建新文件;游標在文件的末尾,意味著以追加的方式寫入內容。 - 返回值:
成功:返迴文件指針(當前被打開的文件的文件指針)
失敗:返回NULL
➤ 思考fopen函數的返回值是一個指向被打開文件的FILE類型的指針,請問FILE類型是什麼?
回答:FILE類型其實是一個結構體數據類型,它包含了標準 I/O 庫函數為管理文件所需要的所有信息,比如包括用於實際I/O 的文件描述符、指向文件緩衝區的指針、緩衝區的長度、當前緩衝區中的位元組數以及出錯標誌等。
補充:kernel採用鏈式結構來管理被打開的文件,原因:FILE結構體類型中有一個成員是FILE類型的指針變數chain,該指針可以指向下一個被打開文件的文件信息區,也就是可以把FILE類型當做數據結構中的鏈表的結點,結點中除了可以存儲數據域之外,還可以利用指針域存儲下一個結點的地址。
註意:
打開文件的目的無非就是對文件進行讀寫操作,所以每次當程式運行的時候已經有三個文件流被打開,分別是標準輸入stdin、標準輸出stdout、標準出錯stderr,這三者在stdio.h中也是FILE指針。
2.使用標準IO的時候,是不可以反覆關閉相同的文件,因為釋放已經被釋放的堆記憶體,會導致段錯誤!!
二、讀取數據
標準C庫中提供了多個讀取函數,這些函數大體分為三類:字元讀取(fgetc)、按行讀取(fgets)、按塊讀取(fread)。
(1)字元讀取
函數2:fgetc
- 頭文件:
#include<stdio.h>
- fgetc函數的功能:
獲取指定文件的一個字元 - fgetc函數作用流程:
從文件指針stream指向的文件中讀取一個字元,併在讀取一個位元組後把文件的游標位置向後移一個位元組,然後讀取成功則把讀取到的字元所對應的ASCII碼通過返回值返回,讀取失敗則返回EOF。 - 函數原型:
int fgetc(FILE *stream );
- 函數參數:fgetc函數僅1個參數
參數FILE *stream:指的是文件指針 - 結束條件:
文件的游標已經到達文件末尾或者遇到讀取錯誤時 - 返回值:
成功:返回讀取字元的ASCII 碼
失敗:返回EOF (EOF 是一個巨集定義,巨集定義的值為-1)
另外,在標準庫中還提供了另一個函數getc(),這個函數的作用等效於fgetc()函數,只不過getc()函數的實現是利用巨集定義而已。
函數3:getc
- 頭文件:
#include<stdio.h>
- getc函數的功能:
獲取指定文件的一個字元 - getc函數的作用流程:
同fgetc函數作用流程一致 - 函數原型:
int getc(FILE *stream );
- 函數參數:getc函數僅1個參數
參數FILE *stream:指的是文件指針 - 結束條件:
文件的游標已經到達文件末尾或者遇到讀取錯誤時 - 返回值:
成功:返回讀取字元的ASCII 碼
失敗:返回EOF (EOF 是一個巨集定義,巨集定義的值為-1)
函數4:getchar
- 頭文件:
#include<stdio.h>
- getchar函數的作用流程及功能是:
getchar函數只能從標準輸入中獲取一個字元。 - 函數原型:
int getchar(void );
- 函數參數:
fgetc函數無參數 - 結束條件:
文件的游標已經到達文件末尾或者遇到讀取錯誤時 - 返回值:
成功:返回讀取字元的ASCII 碼
失敗:返回EOF (EOF 是一個巨集定義,巨集定義的值為-1)
➤ 應用練習:在本地磁碟打開一個存儲少量數據的文本demo.txt,利用fgetc函數把文本中的字元輸出到屏幕,當文本中所有字元都輸出完成後就結束程式。
(2)按行讀取
函數5:fgets
- 頭文件:
#include<sys/ioctl.h>;
- fgets函數的功能:從指定文件讀取最多一行數據
- fgets函數的作用流程是:
從文件指針stream指向的文件中讀取一行字元,並把讀取的字元存儲在指針s所指向的字元串內,當讀取到n-1個(n-1個指的是自定義緩衝區的最大容量為n-1)字元、或者已經讀取到文件末尾(EOF)、或者讀取到換行符’\n’時,則函數調用停止。 - 函數原型:
char *fgets(char *s,int n,FILE *stream );
- 函數參數:fgets有三個參數
參數一:char *s指的是自定義緩衝區指針
參數二:int n指的是自定義緩衝區大小
參數三:FILE *stream指的是即將被讀取數據的文件指針。 - 結束條件:
1.讀取到第n-1個字元
2.讀取到文件末尾
3.讀取到換行符'\n' - 返回值:
成功:自定義緩衝區指針s
失敗:NULL(文件stream可能已經到達末尾或者遇到錯誤)
函數6:gets
- 頭文件:
#include<sys/ioctl.h>
- gets函數的功能:
從指定文件讀取最多一行數據 - 函數作用流程是:
同fgets函數作用流程相同 - 函數原型:
char *gets(char*s);
- 函數參數:gets函數只有1個參數
參數char*s指的是自定義緩衝區指針 - 結束條件:
1.讀取到第n-1個字元
2.讀取到文件末尾
3.讀取到換行符'\n' - 返回值:
成功:自定義緩衝區指針s
失敗:NULL(文件stream可能已經到達末尾或者遇到錯誤) - 備註:gets()缺失從文件stdin讀入數據
➤ 思考:為什麼fgets函數讀取到換行符\n時會結束?fgets函數中的參數n的意義是什麼??
回答:用戶調用fopen打開文件之後,可以把數據寫入到文件中以及從文件中讀取數據,但是實現讀取和寫入的過程中其實內核並沒有直接操作文件,而是在操作指向文件的結構體指針FILE,也就是用戶寫入的數據和讀取的數據會先存儲在FILE結構體的緩衝區中,當用戶調用刷新緩衝區的函數或者其他讀寫函數時,FILE結構體的緩衝區會被刷新,數據才會被系統寫入文件。
根據IO設備的不同,可以把緩衝區分為輸入緩衝區和輸出緩衝區,同樣,根據刷新形式的不同,可以把緩衝區分為三種:全緩衝、行緩衝、無緩衝。
全緩衝:指的是當緩衝區被填滿就立即把數據沖刷到文件、或者在關閉文件、讀取文件內容以及修改緩衝區類型時也會立即把數據沖刷到文件,一般讀寫文件的時候會採用
無緩衝:指的是沒有緩衝區,直接輸出,一般linux系統的標準出錯stderr就是採用無緩衝,這樣可以把錯誤信息直接輸出。
行緩衝:指的是當緩衝區被填滿(一般緩衝區為4KB,就是4096位元組)或者緩衝區中遇到換行符’\n’時,或者在關閉文件、讀取文件內容以及修改緩衝區類型時也會立即把數據沖刷到文件中,一般操作IO設備時會採用,比如printf函數就是採用行緩衝。
註意:對於標準輸出stdout而言預設是採用行緩衝的,而對於標準出錯stderr而言預設是採用無緩衝的,對於普通文件而言預設是採用全緩衝的。
(3)按塊讀取
函數7:fread
- 頭文件:
#include<sys/ioctl.h>
- fread函數的功能:
從指定文件讀取若幹個數據塊 - fread函數的作用流程:
從給定的文件輸入流stream中讀取最多nmemb個塊到指針ptr指向的字元串中,每個塊的大小為size位元組,函數返回成功讀取的塊的個數,若出現錯誤或到達文件末尾,則可能小於nmemb。若size或nmemb為零,則fread函數返回0且不進行其他動作。 - 函數fread的原型:
size_t fread (void *ptr,size_t size,size_t nmemb,FILE *stream);
- 函數fread的參數: 函數fread有四個參數
參數一:自定義緩衝區指針
參數二:數據塊的大小
參數三:數據塊的個數
參數四:即將被讀取數據的文件指針 - 函數fread的返回值:
成功:返回讀取的數據塊的個數,等於nmemb
失敗:返回讀取的數據塊的個數,小於nmemb或等於0 - 備註:
1.當返回小於nmemb時,文件strem可能已經到達末尾,或者遇到錯誤
2.當讀取數據發生錯誤時、讀取部分元素沒有讀全的情況下,文件指示器的位置是不確定的。
➤ 思考:可以知道函數的返回值如果小於nmemb則說明可能出現讀取錯誤或者到達文件末尾,那應該如何區分這兩種情況?
回答:可以通過標準庫中提供的兩個函數區分,一個函數是feof(),另一個則是ferror函數。
函數8:feof
- feof函數的功能:
判斷fread函數返回值小於nmemb的原因是 到達文件末尾 - 頭文件:
#include<stdio.h>
- 函數feof的原型:
int feof(FILE *stream);
- 函數fread的參數:函數feof有一個參數
參數:指的是即將被讀取數據的文件指針 - 函數feof的返回值:
返回0:文件指示器的位置不在末尾
返回非0:文件指示器的位置位於末尾
函數9:ferror
-
ferror函數的功能:
判斷fread函數返回值小於nmemb的原因是 出現 讀取錯誤 -
頭文件:
#include<stdio.h>
-
函數ferror的原型:
ferror(FILE *stream);
-
函數ferror的參數:函數ferror有一個參數
參數:指的是即將被讀取數據的文件指針 -
函數ferror的返回值:
返回0:沒有出現讀取錯誤
返回非0:出現了讀取錯誤
三、寫入文件
(1)字元寫入
函數10:fputc
函數11:putc
函數12:putchar
- fputc函數的功能:
將一個字元寫入一個指定的文件,補充:如果文件以追加的方式打開,則字元會追加文件的末尾 - 頭文件:
#include<stdio.h>
- 函數fputc的原型:
int fputc(int c,FILE *stream);
int putc(int c,FILE *stream);
int putchar(int c);
- 函數fputc的參數:函數fputc有兩個參數
參數一int c:指的是待寫入的字元的ASCAII碼
參數二FILE *stream:待寫入的文件的指針 - 函數fputc的返回值:
成功:返回寫入的字元的ASCAII碼
失敗:返回EOF
(2)按行寫入
函數13:fputs
函數14:puts
- 函數fputs、puts的功能:
將數據寫入指定的文件,補充:字元串的結束符沒有被寫入到文件中 - 函數fputs、puts頭文件:
#include<sys/ioctl.h>
- 函數fputs、puts的原型:
int fputs(const char *s,FILE *stream);
int puts(const char *s);
- 函數fputs、puts的參數:函數fputs有兩個參數,函數puts有一個參數
參數一const char *s:指的是自定義緩衝區指針
參數二FILE *stream:指的是即將被寫入數據的文件指針 - 函數的返回值:
成功:返回非負整數
失敗:返回EOF - 備註:puts()缺失將數據寫入文件stdout
(3)按塊寫入
- fwrite函數的功能:
將若幹塊數據寫入指定的文件 - fwrite頭文件:
#include<sys/ioctl.h>
- 函數fwrite的原型:
size_t fwrite(const void*ptr,size_t size,size_t nmemb,FILE *stream);
- 函數fwrite的參數:函數rwrite有四個參數
參數一:自定義緩衝區指針
參數二:數據塊大小
參數三:數據塊的個數
參數四:即將被寫入數據的文件指針 - 函數fwirte的返回值:
成功:返回寫入的數據塊個數,等於nmemb
失敗:返回寫入的數據塊個數,小於nmemb或等於0
四、關閉文件
函數15:fclose
- 函數fclose的功能:
關閉指定的文件並釋放其資源 - fclose頭文件:
#include<stdio.h>
- 函數fclose的原型:
int fclose(FILE *stream);
- 函數fclose的參數:函數fclose有一個參數
參數:即將要關閉的文件 - 函數close的返回值:
成功:返回0
失敗:返回EOF
五、文件位置
(1)設置位移
函數:16fseek
- fseek函數的功能:
設置指定文件的當前位置偏移量 - 頭文件:
#include<sys/ioctl.h>
- 函數f的原seek型:
int fseek(FILE *stream,long int offset ,int whence);
- 函數fseek的參數:函數fseek有三個參數
參數一stream:需要設置位置偏移量的文件指針
參數二offset:新位置偏移量相對於基準點的偏移量(可正可負)
參數三whence(基準點):
①:SEEK_SET:文件開頭處
②:SEEK_CUR:當前位置
③:SEEK_END:文件末尾處 - 函數fseek的返回值:
成功:返回0
失敗:返回-1
(2)獲取位移
函數17:ftell
- 函數ftell的功能:
獲取指定文件的當前位置偏移量 - 函數ftell頭文件:
#include<sys/ioctl.h>
- 函數ftell的原型:
long int ftell(FILE *stream);
- 函數ftell的參數:函數有一個參數
參數:需要返回當前文件位置偏移量的文件指針 - 函數的返回值:
成功:返回當前文件位置偏移量
失敗:返回-1
fseek函數與ftell函數結合可用來求文件大小
六、格式訪問
一般常用的關於文件IO的格式化函數有printf、fprintf、scanf、fscanf、sprintf、snprintf
系統IO介面
System Calls:系統調用(Linux內核提供的API應用程式介面),SDK:軟體開發工具包,別人寫好的代碼案例,SDK裡面有很多API
- 基本概念
Linux系統下“一切皆文件”,即Linux系統下的數據和程式都是以文件的形式存儲的,故Linux內核會提供一組操作文件的函數介面,這組函數介面也被稱為系統IO;
為了滿足用戶訪問文件的需求以及提高用戶程式的可移植性,標準庫也提供了一組操作文件的函數介面,這組函數介面也被稱為標準IO,是為了方便用戶在不同的操作系統下可以調用通用的函數來實現對文件的讀寫訪問。 - 標準IO與系統IO的區別:標準I/O可以看成是在系統I/O的基礎上封裝了緩衝機制
標準IO的優點是提供了緩衝區並且函數介面非常豐富,避免頻繁的系統調用,提高了I/O的效率;
缺點是:沒有辦法針對某些類型的文件(鏈接文件、套接字文件)進行訪問,所以一般適合訪問普通文件。
系統IO的優點是:可以針對特定類型文件進行訪問,所以一般適合訪問數據需要實時刷新的硬體設備(LCD、觸摸屏......)。
缺點是不具備輸入輸出緩衝區,沒辦法高效處理數據,原因是:因為系統調用的過程中內核要執行一系列的操作:首先內核需要捕獲調用,然後再檢查系統調用傳遞的參數的有效性,最後在用戶空間和內核空間之間傳輸數據。
一、打開文件
函數18:open
- 函數open的功能:
一般可用於打開驅動文件,該函數在C99標準中是查不到的,可在man手冊的第二章查找。 - open頭文件:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
- 函數open的原型:
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,made_t mode);
- 函數open的參數:函數open有兩個參數
參數一:待打開的文件 路徑
參數二:
① O_RDONLY , O_WRONLY , O_RDWR 必須三選一,或者用位運算符 | 來將標誌聯合使用
參數三::
O_CREAT(創建標誌,如果文件不存在則創建),O_EXCL(如果調用了open函數時,使用了O_CREAT和O_EXCL,並且打開的文件是存在的,則open函數調用會失敗,如果文件不存在,則會創建)
註意:O_EXCL和O_CREAT一般是配套使用的,不能單獨使用
補充:open函數的第三個參數mode只有在open函數的第二個參數flags使用O_CREAT或者O_TMPFILE才會使用,也就是說,打開一個已經存在的文件使用第一個版本的open函數即可,第二個版本的open函數的mode參數是指利用open函數創建新文件時給新創建的文件一個指定許可權,被創建的文件的許可權其實就是Linux系統下文件的許可權。
註意:一般在Linux系統下可以直接使用shell命令來修改文件的許可權,比如指令chmod 777 xxx.txt就是給該文檔一個最高許可權。
- 函數open的返回值:
成功:文件描述符:是一個小的非負整數,從一組數中選一個小的且未被使用的
失敗:返回-1
二、關閉文件
函數19:close
- 函數close的功能:
關閉文件(可理解為關閉1個文件描述符) - 函數close頭文件:
#include<unistd.h>
- 函數open的原型:
int close(int fd);
- 函數close的參數:函數close只有一個函數
參數int fd:文件描述符,是open的返回值。 - 函數open的返回值:
成功:返回0
失敗:返回-1
三、文件讀取
函數20:read
- 函數read的功能:
read函數嘗試從fd對應的文件中讀取最多count個位元組的數據並存儲到buf指向的緩衝區中 - 函數read頭文件:
#include<unistd.h>
- 函數raed的原型:
ssize_t read(int fd,void *buf,size_tcount);
- 函數read的參數:函數read有三個參數
參數一int fd:文件描述符,是open的返回值。
參數二void *buf,讀到指定存儲空間的地址
參數三size_tcount:讀取count個位元組 - 函數read的返回值:返回讀取的位元組數量
返回0: 讀取到文件末尾
返回-1:讀取出錯
四、文件寫入
函數21:write
- 函數write的功能:
函數write()函數會把參數buf所指的記憶體寫入count個位元組到參數fd所指的文件內 - 函數write頭文件:
#include<unistd.h>
- 函數write的原型:
ssize_t write(int fd,void *buf,size_tcount);
- 函數write的參數:函數write有三個參數
參數一int fd:輸入文件描述符,是open的返回值。
參數二void *buf,寫到指定存儲空間的地址
參數三size_tcount:寫count個位元組 - 函數write的返回值:成功寫入文件的位元組數
返回0:寫入文檔的位元組數
返回-1:寫入出錯
四、位置位移
函數22:lseek
- 函數lseek的功能:
設置文件的位置指示器的位移 - 函數lseek頭文件:
#include<unistd.h>
#include<sys/types.h>
- 函數lseek的原型:
off_t lseek(int fd,off_t offset,int whence);
- 函數lseek的參數:函數write有三個參數
參數一int fd:輸入文件描述符,是open的返回值。
參數二off_t offset:偏移量
參數三int whence:
文件開頭:SEEK_SET
當前位置:SEEK_CUR
文件末尾:SEEK_END - 函數lseek的返回值:
成功:返迴文件位置指示器相較於開頭的偏移量,以位元組為單位
失敗:返回-1