1. 程式人生 > 其它 >linux c 檔案操作(系統IO與標準IO)

linux c 檔案操作(系統IO與標準IO)

技術標籤:linuxc語言經驗分享

文章目錄


前言

本文主要記下學習 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操作。stdinstdout通常是行快取的。
無快取. 相當於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 這連個格式讀取寫入函式,功能強大,這裡就先不說了,有興趣的童鞋可以自己先嚐試一下,以後若有機會再補上。


總結

本文只是寫出了介面及解析,至於例項原始碼先不貼啦,下次有時間我再更新上來吧。
文中若有勘誤還望不吝指出,謝謝啦~