標準IO和系統IO的相關知識積累

来源:https://www.cnblogs.com/LvYaoNan/p/18178500
-Advertisement-
Play Games

目錄文件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而言預設是採用無緩衝的,對於普通文件而言預設是採用全緩衝的。

image

(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系統下文件的許可權。
    image

註意:一般在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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 目錄一、什麼是PXE1、簡介2、工作模式3、工作流程二、什麼是Kickstart1、簡介2、觸發方式三、無人值守安裝系統工作流程四、實驗部署1、環境準備2、服務端:關閉防火牆和selinux3、添加一張僅主機的網卡4、配置僅主機的網卡4.1、修改網路連接名4.2、配IP地址4.3、重啟網卡5、配置D ...
  • 文件IO練習題 設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。 代碼: /*************************************************************************** ...
  • 解題的關鍵在於 顯示圖片的雙重for迴圈條件與目標位置的結合,且該程式輸入的坐標值為圖片左上角像素點坐標 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...