這幾個函數的區別:fread、fwrite、fopen和open、read、write區別解析
標準C庫函數的簡單使用
fopen函數原型:
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);第一個參數是:要打開的文件路徑
第二個參數是:以什么權限打開
文件順利打開后,指向該流的 文件指針(FILE*) 就會被返回。如果文件打開失敗則返回NULL,并把錯誤代碼存在errno 中。
mode打開模式(注意雙引號):
“r” 以只讀方式打開文件,該文件必須存在。“r+” 以可讀寫方式打開文件,該文件必須存在。”rb+“ 讀寫打開一個 二進制文件,允許讀寫數據(可以任意修改),文件必須存在。“w” 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。“w+” 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。“a” 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(
EOF符保留)”a+“ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。
(原來的EOF符不保留)“wb” 只寫打開或新建一個 二進制文件;只允許寫數據(若文件存在則文件長度清為零,即該文件內容會消失)“wb+” 讀寫打開或建立一個二進制文件,允許讀和寫(若文件存在則文件長度清為零,即該文件內容會消失)
fwrite函數:
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);ptr:是一個指向用于保存數據的內存位置的指針(是一個指針,對于fwrite來說,是要獲取數據的地址)
size: 是每次讀取的字節數
nmemb: 是讀取的次數
stream: 是數據寫入的流(目標指針的文件)
返回值:
成功,該函數返回一個 size_t 對象,表示元素的總數(其實就是nmemb),該對象是一個整型數據類型。如果該數字與 nmemb 參數不同,則會顯示一個錯誤。
失敗:返回0
是實際寫入的元素(并非字節)數目
ps:如果輸入過程中遇到了文件尾或者輸出過程中出現了失誤,這個數字可能比請求的元素數目要小
fread函數:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);buffer: 是讀取的數據存放的內存的指針,(可以是數組,也可以是新開辟的空間)ps: 是一個指向用于保存數據的內存位置的指針(為指向緩沖區保存或讀取的數據或者是用于接收數據的內存地址)
size: 是每次讀取的字節數
nmemb: 是讀取的次數
stream: 是要讀取的文件的指針ps: 是數據讀取的流(輸入流)返回值:
成功:是實際讀取的元素(并非字節)數目,當目標緩沖區是20字節時,而讀100次,返回的是實際讀到有字節的次數。
失敗:返回0
ps:如果輸入過程中遇到了文件尾或者輸出過程中出現了錯誤,這個數字可能比請求的元素數目要小
fseek函數:
int fseek( FILE *stream, long offset, int origin );
第一個參數stream為文件指針
第二個參數offset為偏移量,整數表示正向偏移,負數表示負向偏移
第三個參數origin設定從文件的哪里開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件開頭
SEEK_CUR: 當前位置
SEEK_END: 文件結尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次為0,1和2.
返回值:成功返回0,失敗返回非0.
代碼的綜合:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{FILE *fp;//定義文件指針char* buf="ffffff";char* readbuf=NULL;readbuf=(char*)malloc(strlen(buf));int n_write;int n_read;fp=fopen("./filetest","w+");if(fp==NULL){printf("文件打開失敗\n");perror("fopen");exit(0);}n_write=fwrite(buf,sizeof(char),strlen(buf),fp);if(n_write==0){printf("寫入失敗\n");perror("fwrite");exit(0);}fseek(fp,0,0);n_read=fread(readbuf,sizeof(char),strlen(buf),fp);if(n_read==0){printf("讀取失敗\n");perror("fread");exit(0);}fseek(fp,0,0);n_read=fread(readbuf,sizeof(char),strlen(buf),fp);if(n_read==0){printf("讀取失敗\n");perror("fread");exit(0);}printf("寫入:%d個,讀出:%d個,內容為:%s\n",n_write,n_read,readbuf);fclose(fp);return 0;
}
fputc、fputs、feof、fgetc、fgets函數:
int fputc(int c, FILE *stream);
參數:c:字符fp:文件指針
返回值:成功:返回寫入的字符失敗:返回EOF
int fputs(const char *s, FILE *stream);
參數:s:字符串fp:文件指針
返回值:成功:返回非負數失敗:返回EOFfgetc函數原型:int fgetc(FILE *stream);從文件fp中讀入一個字節,指針自動后移為什么fgetc返回的是int而不是char?
通過man fgetc查看其返回值:fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.
返回時,unchar型會被轉換為int,因為讀到文件尾時需要返回的是EOF(-1), 如果為char型,-1與0XFF相等,會發生沖突
返回值: 若成功,則返回讀取的“字節”,同于fputc函數的 ch,到達文件尾,返回EOF結束函數原型char * fgets(char *str,int n,FILE *fp)從文件中每次讀入一行。
str是存放將要讀入字符型數據的存放地址
n是數目變量
fp是文件指針
該函數表明從文件fp中讀入n-1個字符放在以str為起始地址的空間
因為系統會在最后加上一個‘\0’。讀入過程中:
若該行字符數不超過n-2個(2代表該行本身的換行符‘\n’和系統自動加上的'\0')
則函數讀完該行就結束,文件指針移動到下一行,再進行文件讀入操作時,從下一行開始讀入。若該行字符數目總數(不包含換行符)大于n-2,則只讀入n-1個字符(1代表系統自己加上的'\0')
文件指針自動移動到下一個字符處,再進行文件讀入操作時,順序讀入該行剩下的字符。返回值:
文件讀入成功則返回str,失敗或者讀到文件尾則返回null。feof 函數原型:int feof(FILE *stream);
feof()是檢測流上的文件結束符的函數,如果文件結束,則返回非0值,否則返回0
大佬博客:fgets 函數用法