基礎IO [文件的輸入輸出操作]

  1. 回顧標準庫的IO接口
  2. 學習linux下系統調用IO接口
  3. 文件描述符的理解
  4. 重定向的理解
  5. 文件系統
  6. 庫文件

1、回顧標準庫的IO接口

     fopen / fread / fwrite / fseek / fclose  stdin / stdout / stderr

  • FILE *fopen(char *filename, char *mode);(文件名稱,打開方式)

打開方式:r-> 只讀,r+ ->讀寫, w->只寫, w+ ->讀寫, a->追加寫(每次寫入數據總是寫入到文件末尾), a+ ->追加讀寫, b->二進制操作。

r+的讀寫與w+讀寫的區別:r+ 讀寫打開文件,若文件不存在則報錯;w+ 讀寫打開文件,若不存在則創建,若存在清空原有內容。

a-> 不僅僅是追加寫,文件不存在還會創建新文件。

b-> 默認清空,如果不指定b,則認爲是文本操作,加上b則認爲是二進制操作;區別在於-> 有時候一個特殊字符,只是一個字符但是佔據兩個字節的內存(讀取一個100字節大小的文件,文本操作最終讀取出來的數據,不一定是100個字節)。

返回值:返回一個FILE*的文件流指針作爲文件的操作句柄;失敗返回NULL.

  • size_t fread(char *buf, size_t block_size, size_t block_count, FILE* fp); (緩衝區,塊大小,塊個數,文件流指針)
  • size_t fwrite(char *data, size_t block_size, size_t block_count, FILE* fp); (數據首地址,塊大小,塊個數,文件流指針)

note: fread/fwrite 操作的數據實際大小是塊大小*塊個數;塊大小=10,塊個數=2;意味着要寫入/讀取20個字節的數據;

返回值:返回實際操作的塊個數。 例如:讀取一個文件size=10,count=2; 如果文件大小足夠則返回2/但是若文件大小隻有16字節,則會返回1,因爲第二塊沒有讀滿。

fread 如果讀到了文件末尾會返回0;若讀取1000個字節,塊個數爲1,文件大小隻有512字節,雖然讀取了512的數據但是也會返回0.

  • int fseek(FILE *fp, long offset, int whence);(將文件的讀寫指針從whence位置偏移offset個字節)--> 跳轉文件讀寫位置
  • int fclose(FILE *fp); 關閉文件流指針,釋放資源。

fread/fwrite比較推薦塊大小爲1,塊個數是想要操作的數據長度;

fseek:文件沒有數據也可以跳轉讀寫位置;

對文件數據進行字符串操作的時候要注意文件數據中的\0 這種數據。

標準庫中的IO接口,都是庫函數,而庫函數是對系統調用接口的一層封裝。

2、系統調用接口

open / read / write / lseek / close

  • int open(char *filename, int flag, mode_t mode);

filename:要打開的文件名稱

flag:選項參數--文件的打開方式  必選項/可選項

必選項(只能選其一): O_RDONLY-只讀 O_WRONLY-只寫 O_RDWR-讀寫

可選項:O_CREAT - 文件存在則打開,不存在則創建;O_EXCL 與 O_CREAT 同時使用,文件存在則報錯,不存在則創建;O_TRUNC- 打開文件的同時清空原有內容;O_APPEND-追加寫,總是將數據寫入到文件末尾。

mode:權限--如果使用了O_CREAT有可能創建新文件,就一定要指定文件權限(mode & ~umask)---umask(0),八進制數字形式。

返回值:一個非負整數--文件描述符--文件的操作句柄;失敗返回-1;

  • ssize_ t write(int fd, char *buf,size_t count);

fd:open 返回的文件描述符--文件操作句柄

buf:要寫入文件的數據的空間首地址

count:要寫入的數據大小

返回值:返回實際寫入文件的數據字節長度;失敗返回-1;

ssize_t read(int fd, char *buf, size_t len);

fd:open返回的文件描述符

buf:從文件中讀取數據放到哪塊緩衝區中的首地址

len:想要讀取的數據長度,注意len不能大於緩衝區的大小

返回值:返回的是實際讀取到的數據字節長度,錯誤返回-1.

off_t lseek(int fd, off_t offset, int whence);

fd:open 返回的文件描述符

offset:偏移量

whence:從哪裏開始偏移 SEEK_SET-文件起始位置  SEEK_CUR-文件當前讀寫位置  SEEK_END-文件末尾

返回值:成功返回當前位置相對於起始位置的偏移量;失敗返回-1;

int close(int fd); 通過文件描述符關閉文件,釋放資源。

3、文件描述符

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章