標準IO
- 出現的緣由:C語言標準委員會,爲了統一編程接口
- Linux:y一切皆文件
- 標準IO爲了減小磁盤的損耗,減小讀寫次數,對文件分配了輸入輸出兩個緩衝區,struct FILE
- 緩衝區的大小(setbuf()設置):
- 全緩衝:默認狀況
- 行緩衝:printf()
- 無緩衝:perror()
1 函數接口:
1.1 打開—->fopen()
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
- FILE *fopen(const char *path, const char *mode);
- path: 要打開的文件;
- mode: 以什麼方式打開;
- r 以只讀方式打開,若是沒有該文件,則會報錯,打開後,讀指針在文件開頭。
- r+ 以讀寫方式打開,其餘與r方式相同。
- w 以只寫方式打開,若是文件沒有,則新建立。若是有,則會把原來內容清空,寫指針在文件開頭。
- w+ 以讀寫方式打開,其餘與w相同
- a append的簡寫,追加打開,文件不存在,則建立。 打開後,讀寫指針在文件尾部
- a+ 與a相同,讀指針在開頭,寫指針在尾部。
- 返回值:
- 正確:指向你打開的文件的FILE結構。
- 錯誤,NULL
- 下面三個文件系統會自動打開,直接用就能夠:
- FILE *stdin
- FILE *stdout
- FILE *stderr
1.2 關閉—->fclose()
1.3 文件的讀寫
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- ptr: 從stream文件裏讀到的信息存放到ptr爲首地址的地方
- size:讀數據的單位
- nmemb:讀多少個上面的單位
- stream:從哪裏讀
- 返回值:真正讀到多少個單位,而不是字節數!!!!
- 件stream的讀指針向移動(返回值*單位大小)個字節
- size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
- ptr: 要將ptr爲首地址的數據寫入到stream文件
- size:要寫數據的單位
- nmemb:寫多少個上面的單位
- stream:寫到哪裏去
- 返回值:真正讀到多少單位
- 文件stream的讀指針向移動(返回值*單位大小)個字節
- int fgetc(FILE *stream);
- fuction:從文件中讀取一個字符
- return:字符的ASCII
- 讀指針:讀出一個字符後,讀指針自動日後跳一個
- int fputc(int c, FILE *stream);
- char *fgets(char *s, int size, FILE *stream);
- function:從stream流讀的數據存放的位置。
- size:要讀的大小
- stream:打開的文件
- 返回:fgets讀完了數據後,會自動在s的尾部加換行符\n,會將stream的讀指針挪到第二行
不會忽略空格
- int fputs(const char *s, FILE *stream);
1.4 判斷文件是否結束feof()
- if/while(feof(fp)) 若是fp結束爲真
- if/while(!feof(fp)) 若是fp沒結束爲真
- feof不太穩定,已經結束了,判斷沒結束
1.5 格式化
- int fscanf(FILE *stream, const char *format, …);
- function:從stream裏按format的格式讀出數據
- …:若干個讀出來的數據項地址
- 返回值:真正讀出的數據項的個數
- int sscanf(const char *str, const char *format, …);
- int fprintf(FILE *stream, const char *format, …);
- 將…的數據按format格式寫入到文件stream中,不過這個函數不安全,容易越界
- int snprintf(char *str, size_t size, const char *format, …);
- function:同上
- size:最多寫多少個字符
1.6 沖洗函數
- int fflush(FILE *stream);
- 若是stream是輸入流,則丟棄stream的緩衝區
1.7 定位函數
- int fseek(FILE *stream, long offset, int whence);
- long ftell(FILE *stream);
- void rewind(FILE *stream);
- int fgetpos(FILE *stream, fpos_t *pos);
- int fsetpos(FILE *stream, const fpos_t *pos);