linux c 檔案操作(系統IO與標準IO)
阿新 • • 發佈:2021-01-22
文章目錄
前言
本文主要記下學習 C 語言時在檔案操作上的筆記,備忘之餘希望能夠幫到迷路的童鞋。
一、系統I/O(無緩衝區)
1. 標頭檔案
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
2. 建立檔案
int create (const char *file_name, mode_t mode);
@mode: S_IRUSR, S_IWUSR, S_IXUSR, S_IXRWU
可讀 可寫 可執行 全許可權
返回值:成功返回當前檔案的檔案描述符,失敗返回-1。
3. 開啟檔案
int open(const char *file_name, int flags, mode_t mode);
@mode: 可選引數,只有當flags包含O_CREAT時才用到。
@flags: O_CREAT 當檔案不存在時建立它,並指定mode引數;
O_EXCL 一般和O_CREAT一起使用,要求這個檔案一定不存在;
返回值:成功返回新分配的檔案描述符;失敗返回-1,且errno被設定。
4. 讀取檔案
int read( int fd, const void *buf, size_t length);
從哪兒讀 讀到哪兒 讀多長
返回值:成功返回非負數;失敗返回-1。
5. 寫入檔案
int write( int fd, const void *buf, size_t length);
寫到哪兒 從哪兒寫 寫多長
返回值:成功返回非負數;失敗返回-1。
6. 定位操作位置
int lseek(int fd, offset_t offset, int whence);
@offset: > 0 基於whence向右偏移
< 0 基於whence向左偏移
@whence: SEEK_SET 0 開頭
SEEK_CUR 1 當前
SEEK_END 2 末尾
返回值:成功返回當前操作位置與開頭之間相差的位元組數;失敗返回-1。
二、標準I/O(有緩衝區)
1. 提供了三種類型的快取:
全快取. 當填滿標準I/O快取後才執行I/O操作,磁碟上的檔案通常是全快取的。
行快取. 當輸入輸出遇到新行符或快取滿時,才由標準I/O庫執行實際I/O操作。stdin、stdout通常是行快取的。
無快取. 相當於read、write了,stderr通常是無快取的,因為它必須儘快輸出。
2. 開啟檔案
FILE *fopen(char *file_name, char *mode);
@mode: r, r+, w, w+, a, a+, b, t
當使用w系模式時,會將原檔案清空;r+和w+都有讀寫許可權,注意區別
返回值:成功返回檔案指標;失敗返回NULL。
3. 關閉檔案
int fclose(FILE *fp);
返回值:成功返回0;失敗返回非0值。
4. 以單個字元讀取
int fgetc(FILE *fp);
返回值:成功返回讀取到的字元;失敗返回EOF。
5. 以單個字元寫入
int fputc(int ch, FILE *fp);
@ch: 要被寫入的字元
返回值:成功返回寫入的字元;失敗返回EOF。
6. 以字串讀取
char *fgets(char *str, int length, FILE *fp);
讀到那兒 讀多長 從哪兒讀
@str: 用於存放讀到的字串
@n: 讀取長度,包含’\0’
返回值:成功返回存放字串的字元陣列首地址;失敗返回NULL(當讀取到文件末尾時亦返回NULL)。
7. 以字串寫入
char *fputs(char *str, FILE *fp);
從哪兒寫 寫到那兒
返回值:成功返回非負數;失敗返回EOF。
8. 是否讀到了文件尾?
int feof(FILE *fp);
返回值:成功返回真;失敗返回假。
9. 是否讀取過程出錯?
int ferror(FILE *fp);
返回值:成功返回真;失敗返回假。
10. 標準讀取函式
// 這個函式使用前一般先回定義一個緩衝區作為第一個引數,如
// char buffer[1024] = {0};
size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
讀到那兒 每一塊多大 一共多少塊 從哪兒讀
@ptr: 臨時存放讀取到的內容的緩衝區
@size: 每次讀取的資料塊的大小
@count: 一共讀取多少塊資料
返回值:成功讀取到的資料塊塊數( 0 <= 返回值 <= count )。
11. 標準寫入函式
size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);
資料來源 每一塊多大 一共多少塊 寫到哪兒
@ptr: 臨時存放要寫入的內容的緩衝區
@size: 每次讀取的資料塊的大小
@count: 一共讀取多少塊資料
返回值:成功寫入的資料塊塊數( 0 <= 返回值 <= count )。
12. 指定操作位置
int fseek(FILE *fp, long offset, int origin);
@fp: 要偏移操作位置的檔案指標
@offset: 偏移大小
@origin: SEEK_SET 0 開頭
SEEK_CUR 1 當前
SEEK_END 2 末尾
返回值:成功返回0,失敗返回-1。
13. 當前操作位置與開頭的距離
long ftell(FILE *fp);
返回值:成功返回當前操作位置與開頭的位元組數,失敗返回-1;
14. 重置檔案操作位置
void rewind(FILE *fp);
讓檔案操作位置重新回到檔案開頭。
另外還有 fscanf 和 fprintf 這連個格式讀取寫入函式,功能強大,這裡就先不說了,有興趣的童鞋可以自己先嚐試一下,以後若有機會再補上。
總結
本文只是寫出了介面及解析,至於例項原始碼先不貼啦,下次有時間我再更新上來吧。
文中若有勘誤還望不吝指出,謝謝啦~