fopen
需要的頭文件:
#include <stdio.h>
函數原型:
FILE *fopen(const char *pathname, const char *mode);
參數:
- pathname: 文件路徑
- mode:
- “r” :以只讀方式打開文件,該文件必須存在。
- “w” :打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
- “a” :以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
- “r+” :以可讀寫方式打開文件,該文件必須存在。
- “w+” :打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
- “a+”:以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。 (原來的EOF符不保留)
- “rb” :只讀打開一個二進制文件,只允許讀數據。
- “wb” :只寫打開或建立一個二進制文件,只允許寫數據。
- “ab” :追加打開一個二進制文件,并在文件末尾寫數據。
- “rb+” :讀寫打開一個二進制文件,允許讀寫數據,文件必須存在。
- “wb+” :讀寫打開或建立一個二進制文件,允許讀和寫。
- “ab+” :讀寫打開一個二進制文件,允許讀,或在文件末追加數據。
- “rt” :只讀打開一個文本文件,只允許讀數據。
- “wt” :只寫打開或建立一個文本文件,只允許寫數據。
- “at” :追加打開一個文本文件,并在文件末尾寫數據。
- “rt+” :讀寫打開一個文本文件,允許讀和寫。
- “wt+” :讀寫打開或建立一個文本文件,允許讀寫。
- “at+” :讀寫打開一個文本文件,允許讀,或在文件末追加數據。
打開方式總結:
① 打開是否為二進制,用“b”標識;
② 讀寫方式有以下幾種:只讀、只寫、讀寫、追加只寫、追加讀寫。
③ 對文件是否必須存在,以及存在時是清空還是追加會有不同的響應。具體判斷如下圖:
參考:fopen函數mode參數詳解_fopen mode_allinallinallin的博客-CSDN博客
- 返回值:文件順利打開后,指向該流的文件指針就會被返回,若文件打開失敗則返回NULL。
fclose
?需要的頭文件:
#include <stdio.h>
函數原型:
int fclose(FILE *stream);
參數:
- stream: 文件指針(也就是fopen成功之后返回的指針)
fread 和 fwrite
?需要的頭文件:
#include <stdio.h>
函數原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
參數:
- ptr: 指向“數據讀取到之后存儲到的緩存區”/“要寫入的數據存放的緩存區”的指針
- size:?讀取/寫入 的 基本單元 字節大小 , 單位是字節 , 且一般是緩沖的單位大小
- 如果緩沖區是 char 數組 , 則該參數的值是 sizeof(char) ;
- 如果緩沖區是 int 數組 , 則該參數的值是 sizeof(int) ;
- nmemb: 讀取/寫入 的 基本單元 個數
- stream:?文件指針
- 返回值 :?實際從文件中讀取/寫入的 基本單元 個數 ; 讀取/寫入的字節數是 基本單元數 * 基本單元字節大小?
- 對于寫write:哪怕size設置基本單元的大小是100個char,但是nmemb設置了1,那么返回值就是1, 返回值嚴格跟隨nmemb的值,但是當緩沖區的數據已經全部寫完的時候,就不會再繼續增加內容了,只不過進行無意義的寫操作使得最后寫的次數等于nmemb
- 對于讀read,同樣返回值大部分情況下跟隨nmemb的值,除了:當給出的讀取緩存區已經已經讀滿了或者已經沒東西可讀了,那么就不會再讀了,并且返回已經讀的基本單元個數
fseek
?需要的頭文件:
#include <stdio.h>
函數原型:
int fseek(FILE *stream, long offset, int whence);
參數:
- stream: 文件指針
- offset: 偏移量
- whence: SEEK_SET(頭)或 SEEK_CUR(當前) 或 SEEK_END(尾)
- 返回值:如果執行成功 , 則返回 0 , 失敗返回非 0 , 并設置 error 錯誤代碼
實操演示
demo9.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE *fp;char *write_buf = "mjmmm";char *read_buf;fp = fopen("./mjm.txt","w+");int count = fwrite(write_buf, sizeof(char), strlen(write_buf),fp);// fwrite(write_buf, sizeof(char)*strlen(write_buf), 1,fp);printf("%d bytes has been written\n",count);fseek(fp,0,SEEK_SET);read_buf = (char *)malloc(sizeof(char)*count);fread(read_buf, sizeof(char),strlen(write_buf),fp); //注意此時第三個參數不能使用 strlen(read_buf), 因為read_buf中沒有任何有效參數,所以會是0//fread(read_buf, sizeof(char)*strlen(write_buf),1,fp);printf("context:%s\n",read_buf);fclose(fp);return 0;
}
運行代碼:
打開mjm.txt:
?