fopen, fwrite, fread詳解
1、頭文件
#include <stdio.h>
2、fopen
(1) 函數原型
FILE *fopen(char *filename, *type)
函數用來打開一個文件
(2) 參數解析
- filename,文件名
- type,打開方式
字符及其含義:
打開方式由r,w,a,t,b,+這六個字符拼成,含義如下
r(read):讀
w(write):寫
a(append):追加
t(txt):文本文件,可省略
b(banary):二進制文件
"r" 打開文字文件只讀
"w" 創建文字文件只寫
"a" 增補, 如果文件不存在則創建一個
"r+" 打開一個文字文件讀/寫
"w+" 創建一個文字文件讀/寫
"a+" 打開或創建一個文件增補
"b" 二進制文件(可以和上面每一項合用)
"t" 文這文件(默認項)
使用方式及含義
“rt” 只讀打開一個文本文件,只允許讀數據
“wt” 只寫打開或建立一個文本文件,只允許寫數據
“at” 追加打開一個文本文件,並在文件末尾寫數據
“rb” 只讀打開一個二進制文件,只允許讀數據
“wb” 只寫打開或建立一個二進制文件,只允許寫數據
“ab” 追加打開一個二進制文件,並在文件末尾寫數據
“rt+” 讀寫打開一個文本文件,允許讀和寫
“wt+” 讀寫打開或建立一個文本文件,允許讀寫
“at+” 讀寫打開一個文本文件,允許讀,或在文件末追加數 據
“rb+” 讀寫打開一個二進制文件,允許讀和寫
“wb+” 讀寫打開或建立一個二進制文件,允許讀和寫
“ab+” 讀寫打開一個二進制文件,允許讀,或在文件末追加數據
① 用”r”打開文件時,該文件必須存在,只讀
② 用”w”打開文件時,若文件不存在,則創建,若存在,則將其刪除,再創建一個文件
③ 用”a”打開文件時,可在其末尾寫數據
(3) 函數調用成功返回FILE*指針,失敗返回NULL
3、fwrite
(1) 函數原型
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )
(2) 參數解析
- ptr,要寫入的數據的指針
- size,每個數據類型的大小
- count,數據個數
- stream,文件指針
(3) 函數調用成功返回寫入數據的個數,如果返回值與count不同,為寫錯誤
(4) 寫操作后最好調用fclose關閉流。
4、fread
(1) 函數原型
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )
(2) 參數解析
- ptr,讀取數據保存結果的指針
- size,每個數據類型的大小
- count,數據個數
- stream,文件指針
(3) 函數調用成功返回讀取的數據個數,如果返回值與count不同,為讀錯誤或者達到文件末尾
5、不關閉流的情況下,每次讀或寫數據后,文件指針都會指向下一個待寫或者讀數據位置的指針。
6、size_t
size_t類型是ANSI C提供的標准頭文件里的一個數據類型,頭文件為:#include <stddef.h>。該頭文件一般位於/usr/lib/gcc/i486-linux-gnu/4.3.2/include目錄下。定義如下:
#define __SIZE_TYPE__ long unsigned int
#define __SIZE_TYPE__ size_t
也就是說size_t實際是long unsigned int類型,在32位機器上為4字節,在64位機器上為8字節。
7、程序示例:
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE* file = fopen("/home/share/code/fopen_test/test.txt", "wt+"); 6 if(file == NULL) 7 { 8 printf("fopen error"); 9 return -1; 10 } 11 12 size_t write_ret = fwrite("hello world", 1, sizeof("hello world"), file); 13 if(write_ret != sizeof("hello world")) 14 { 15 printf("fwrite error"); 16 return -1; 17 } 18 19 //將文件指針定位到文件開始,否則讀取不到數據 20 fseek(file, 0, SEEK_SET); 21 22 char buf[32] = {0}; 23 size_t read_ret = fread(buf, 1, sizeof("hello world"), file); 24 if(read_ret != sizeof("hello world")) 25 { 26 printf("fread error"); 27 return -1; 28 } 29 30 fclose(file); 31 printf("%s\n", buf); 32 33 return 0; 34 }
