四、IO
1. 概念
1.? IO 指 input / output
2.? Linux系統中一切皆是文件
3.? IO操作的對象是文件
2. 文件
1. 概念
一段數據的集合
2. 特點
文件通常存放在外存中,掉點后數據不會丟
3. 分類
- b(block,塊設備文件)
?-- 按塊掃描信息的文件,通常用于存儲設備
?--?數據讀寫以固定大小塊為單位,支持隨機訪問
?-- 文件IO
- c(character,字符設備文件)
?-- 按字符掃描信息的文件,通常用于串行設備
?--?數據是流式的,通常不支持隨機訪問
?-- 文件IO
- d(directory,目錄文件)
?-- 表示一個目錄,用于存放其他文件和子目錄的文件夾
?-- 目錄IO/文件IO
- -(普通文件)
?-- 常見的文件類型,存放一般信息的文件
?-- 標準IO/文件IO
- l(link,鏈接文件)
?-- 操作文件等價于操作文件指向的文件
?-- 鏈接IO/文件IO
- s(socket,套接字文件)
?-- 用來進程間通信,用于網絡通信或本地進程通信
?-- 文件IO
- p(pipe,管道文件)
?-- 用來進程間通信,一種單向數據通道,用于命令間的數據傳遞
?-- 文件IO
3. 標準IO
1. 概念
用來操作普通文件
2. 文件類型
1. ASCII碼文件
文件中的所有內容均為能夠在屏幕上顯示的ASCII碼字符
程序、文本文件均為ASCII碼文件
2. 二進制文件
文件中的所有內容均為數據對應的二進制形式存放,包含一些不能在界面上顯示的內容
ASCII碼文件也是二進制文件
圖片、音視頻、壓縮包均為二進制文件
3. 標準IO的接口
1. fopen / fclose
2. fgetc / fputc
3. fgets / fputs
4. fscanf / fprintf
5. fread / fwrite
6. fseek / rewind/ftell
4. 流
stdin:標準輸入流
stdout:標準輸出流
stderr:標準出錯流
printf、puts、putchar????????通過stdout流實現在終端信息打印
scanf、gets、getchar???????通過stdin流實現獲得終端信息
perror????????????????????????????????通過stderr流實現在終端打印出錯信息
5. 文件的打開
1. fopen
- 原型:FILE *fopen(const char *pathname, const char *mode);
- 功能:
????????打開pathname指向字符串對應的文件,并且和它建立一個流
- 參數:
????????pathname:要打開的文件路徑字符串,mode:打開的方式
- 返回值:
? ? 成功返回FILE*指針,?失敗返回NULL
? ? ? ? r? ? ? ?只讀 ? ????????? 文件存在只讀打開,文件不存在報錯
r+? ? ?讀寫 ? ????????? 文件存在讀寫打開,文件不存在報錯
w? ? ? 只寫 ? ????????? 文件存在清零,文件不存在創建,只寫打開
w+? ? 寫讀? ? ? ? ? ? 文件存在清零,文件不存在創建,寫讀打開
a? ? ? ?追加? ? ? ? ? ? 文件存在追加,文件不存在創建,只寫打開
a+ ? ?追加讀寫? ? ? 文件存在追加,文件不存在創建,寫讀打開
2. fclose
- 原型:int fclose(FILE *stream);
- 功能:
????????關閉已經打開的流
- 參數:
????????stream:文件流指針
- 返回值:
????????成功返回0,失敗返回EOF(-1)
3. fputc
- 原型:int fputc(int c, FILE *stream);
- 功能:
????????將字符c寫入流中
- 參數:
????????c:要寫入的字符,stream:文件流指針
- 返回值:
????????成功返回輸出的ASCII碼值, 失敗返回EOF
putchar() 等價于 fputc(ch, stdout)
4. fgetc
- 原型:int fgetc(FILE *stream);
- 功能:
????????讀取流中的下一個字符
- 參數:
????????stream:文件流指針
- 返回值:
????????成功返回讀到字符的ASCII碼值,失敗或者讀到文件末尾返回EOF
ch = getchar() 等價于 ch = fgetc(stdin)
????????
5. fputs
- 原型:int fputs(const char *s, FILE *stream);
- 功能:
????????向流中寫入s指向的字符串
- 參數:
????????s:要寫入的字符串的首地址,stream:文件流指針
- 返回值:
????????成功返回非負數,失敗返回EOF
6. fgets
- 原型:char *fgets(char *s, int size, FILE *stream);
- 功能:
????????從流中最多讀size-1個字節數據放入s指向的空間中,遇到\n讀取截止
- 參數:
????????s:存放數據空間的首地址,size:最多存放元素的個數,stream:文件流指針
- 返回值:
????????成功返回存放數據空間的首地址
????????失敗返回NULL,讀到文件末尾返回NULL
fputs不會多打印\n字符,puts會多打印一個\n字符
gets會去掉從終端接收的\n字符,fgets不會去掉從終端接收的\n字符
7. fprintf
- 原型:int fprintf(FILE *stream, const char *format, ...);
- 功能:
????????將格式化的字符串打印在流中
- 參數:
????????stream:文件流指針, format:格式化的字符串,? ?...:參數
- 返回值:
????????成功返回打印字符的個數
????????失敗返回負數
8. fscanf
- 原型:int fscanf(FILE *stream, const char *format, ...);
- 功能:
????????從流中接收格式化的字符串
- 參數:
????????stream:文件流指針, format:格式化字符串????????...:參數
- 返回值:
????????成功返回匹配的輸入控制符的個數
????????失敗返回EOF,讀到文件末尾返回EOF
4. 標準IO的緩存
1. 類型
1. 全緩存(4k)
1.緩存區滿刷新緩存
2.刷新條件:
????????緩存區滿4k刷新
????????fflush函數強制刷新
????????fclose或者程序關閉刷新
3.與文件建立的緩存一般為全緩存
2. 行緩存(1k)
1. 遇到\n刷新緩存區
2. 刷新條件:
????????緩存區滿1k刷新
????????遇到\n刷新
????????fflush函數強制刷
????????fclose或者程序關閉刷新
3. 與終端建立的緩存一般為行緩存(stdin、stdout均為行緩存)
3. 不緩存(0k)
1. 立即刷新不緩存
2. 刷新條件:
????????不緩存立即刷新
3. 出錯處理或者人機交互一般使用不緩存(stderr不緩存)
2. 標準IO的緩存
1. 特點
????????標準IO是一種有緩存的IO
????????效率高
????????實時性差
2. 標準IO 與 文件IO
標準IO:用戶代碼 → 庫函數 → 緩存 → 內核
路徑更長,但效率高。
緩存由標準庫管理
文件IO:用戶代碼 → 內核
直接通過open(),read(),write()等系統調用操作,無中間緩沖區。
實時性強,但頻繁調用效率低