标准 I/O (带缓冲)
標準IO中分文本流和二進制流
windows系統中:(1) 二進制流 - 換行符 '\n'? ? (2) 文本流 - 換行符 ‘\r' '\n'
linux 系統中:不區分文本流和二進制流:換行符 - '\n'
?
?
?
?
?
一 。標準I/O 提供3種類型的緩沖(流的緩沖)
1. 行緩沖(大小1024字節);刷新行緩存的方法 (1)程序正常結束,(2)行緩沖區滿,(3)遇到 '\n'? ,(4)使用fflush函數
2. 全緩沖(大小4096字節);刷新全緩存的方法 (1)程序正常結束,(2)行緩沖區滿,(3)使用fflush函數;?
3. 不帶緩存;標準IO庫不對字符進行緩沖,例如標準出錯stderr
?
二 。系統分配的3個流:?
標準輸入 stdin; 標準輸出? stdout? ?; 標準錯誤? stderr ;(標準I/O預定義3個流,當進程創建或者開啟的時候,系統就會先分配三個流指針)
?
三 。文本流:?
通過 FILE 創建一個流指針實現對文本流的操作
打開一個文本的mode參數選擇
?
?頭文件 <stdio.h>
1. 流的打開:FILE * fopen(const *char path, const char *mode)? ; 參數,文件的路徑和打開的模式(只讀,只寫等) , 返回這個文本的指針,可對這個文本流進行讀寫操作等。
2. 流的關閉:int fclose( FILE *stream ); 參數要關閉的文本流,失敗返回EOF(-1) ,成功返回 0?
3. 向流中寫入一個字符 : int fputc(int c, FILE *stream);? ?參數要輸出的字符,和輸出到那個流中(可以是標準流,文本流), 失敗返回EOF, 成功返回 寫入的字符
4. 從流中讀取一個字符:?int fgetc(FILE *stream);? 參數 在那個流中讀取字符,返回讀取的字符(ascii對應)
6. 從流中讀取多個字符:?char *fgets(char *s, int size, FILE *stream);? 參數 s 存放讀取的數據, size 讀取多少個字符,stream?從哪個流讀取的流指針;成功返回 s,失敗返回NULL
7. 向流中寫入多個字符:int fputs(const char *s, FILE *stream); 參數,把 s 中的數據寫入到stream指向的流中,成功返回1 失敗返回-1
8. 刷新緩存:?int fflush(FILE *stream);? ?參數,要刷新的流 成功返回0,失敗返回EOF
?
例子1:從終端輸入獲取字符,然后寫到文本中
#include <stdio.h>int main(int argc, const char *argv[]) {char buf[1024] = {0}; //定義緩沖區,從終端獲取數據,往文本流中寫入 #if 0//向終端輸出puts("HHHHHHHH");fputs("HAHGAGAGAGAGA\n",stdout); //輸出到標準輸出流中,(輸出到終端上) #endif//終端獲取數據放到 buf 中,一會把 buf 中的內容寫到文本流中char ch=0;int i=0;while((ch=getchar())!='q' && i<1024) //終端輸入遇到 q 或者 到達最大緩存,結束輸入 {buf[i++] = ch;}#if 1//向文本中輸出FILE *fp = NULL; if((fp = fopen(argv[1],"w")) == NULL) //參數 "w" 表示寫入,每次打開文件先清空文件,再寫入數據 {perror("open fail:");//標準錯誤輸出return -1;}//把 buf 中的數據寫入到 fp 指向文本流中fputs(buf,fp);//把數據寫入文本流中, fgets 不帶換行符輸入到文本流中fclose(fp); //關閉文本流 #endifreturn 0; }測試結果:
?
?
?
例子2,從文本流中讀取數據
#include <stdio.h>int main(int argc, const char *argv[]) {char buf[1024] = {0};//定義 存放讀取的數據 FILE *fp = NULL;if((fp=fopen(argv[1],"r")) ==NULL){perror("open fail:");}// fgets 只讀取一行的指定個數的內容//循環把文本流中的數據讀完while((fgets(buf,5,fp)) != NULL)//讀取全部數據{printf("%s",buf); //打印讀取到的數據}fclose(fp);return 0; }?
?
四 。 出錯處理
1.? 頭文件<stdio.h>? ??void perror(const char *s);? ? 參數輸出到終端的提示語,后面會跟著打開錯誤錯誤類型提示
2.? 頭文件<string.h>? ?char *strerror(int errnum);? ? 參數??errnum 錯誤號,錯誤原因的信息
?
轉載于:https://www.cnblogs.com/electronic/p/10907403.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的标准 I/O (带缓冲)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神目 Android 人脸识别SDK编译
- 下一篇: html5 head 标签