C標準中的I/O庫是一個比較龐大的庫,實現也比較復雜。顯然I/O庫的實現是依賴于操作系統的,不同的系統上I/O庫的實現機理是不一樣的。glibc中,I/O庫的核心實現在libio目錄下。有4個頭文件libio.h, iolibio.h, libioP.h, strfile.h, stdio.h,其中stdio.h是導出的標準C頭文件,其余都是內部實現。這里并不打算解剖整個I/O庫的源代碼(那樣可能一本書也說不完),只是概述性的介紹一下它的輪廓和所有標準接口的功能。我們學習I/O庫也是為了能在實踐中應用它,因此因此對C標準中所有的I/O接口要有個全面的了解。
輸入/輸出函數主要在stdio.h中,對應的寬字符版本在wchar.h中,下面列出標準C中定義的所有接口:
1、相關類型和常量:FILE、EOF在stdio.h中;wchar_t、wint_t、WEOF、WCHAR_MAX、WCHAR _MIN等在wchar.h中定義。size_t和NULL在stdio.h, wchar.h和stddef.h均會定義,同時使用其中的多個頭文件是無害的。
2、fopen,fclose,fflush,frepoen,fwide,FOPEN_MAX,FILENAME_MAX:打開文件并返回數據流、關閉文件、清空數據流的緩沖區、將文件重新關聯到一個數據流、fwide在wchar.h中用于設置與測試流定向、可以同時打開的數據流最大個數、文件名的最大長度。
文件訪問方式:”r”、”w”、”a”、”r+”、”w+”、”a+”,所有訪問方式后面都可以加上字母b,表示數據流保存二進制數據,而不是字符數據。
3、setvbuf,setbuf,BUFSIZ,_IOFBF,_IOLBF,_IONBF:設置數據流的緩沖區、BUFSIZ緩沖區的默認長度、后面三個是緩沖模式,為數完全緩沖、行緩沖(寫入換行符或緩沖區滿時刷新緩沖區)、數據流不緩沖。
4、stdin,stdout,stderr:標準輸入流、輸出流、錯誤流。除stderr之外,另外兩個數據流都緩沖。C語言程序執行時,會預先打開這3種文本流。
5、fseek,ftell,rewind,fgetops,fsetpos:設置流的讀寫位置、返回流的當前讀寫位置、將流的位置恢復到開頭、fgetpos/fsetpos用于獲取或設置流的位置,其值放在fpos_t類型的參數中。定位碼有SEEK_SET, SEEK_CUR,SEEK_END。
6、fgetc,fgetwc,getc,getwc,getchar,getwchar,ungetc,ungetwc:從流中讀取下一個字符并作為int類型的值返回、getchar則從標準輸入流中讀取、ungetc系列將字符c推回到輸入流中。
7、fgets,fgetws,gets:從流中讀取一個長為n的字符串到s中,直到遇到換行符、文件末尾或讀取了n-1個字符,然后在字符串末尾加上終止符、gets則從標準輸入流中讀取。
8、fscanf,fwscanf,scanf,wscanf,sscanf,swscanf:格式化輸入函數。從流中讀取字符并根據控制字符串把字符轉換成相應的值??刂谱址竺娴拿總€參數應為指針,從輸入流讀取的值轉換之后存放在指針指向的對象中。
控制字符串:除空白符和%號以外的任何其他字符都要匹配輸入流中下一個字符。如果不匹配,則發生沖突,終止轉換操作。指針參數要有正確的個數和正確的類型,符合控制字符串中的轉換說明。
scanf系列的轉換說明以%號開始,然后依次出現下列元素:
(1)可選的賦值取消標志符:*
(2)可選的最大字段寬度:表示為正的十進制整數
(3)可選的長度說明符:有hh,h,l,ll,j,z,t或L
(4)必要的轉換說明符:有a,c,d,e,f,g,i,n,o,p,s,u,x,%或[...]。
常用的轉換說明:%d,%i,%u,%o,%x,%c,%s,%f,%e,%%。
9、fputc,fputwc,putc,putwc,putchar,putwchar:向輸出流中寫入一個字符、putchar則向標準輸出流寫入。
10、fputs,fputws,puts:向輸出流中寫入一個字符串,不包括null終止符、puts則向標準輸出流寫入。
11、fprintf,printf,sprintf,snprintf,fwprintf,wprintf,swprintf:格式化輸出函數。根據控制字符串表示的格式,把輸出轉換成一系列格式發送到輸出流中。
printf系列的轉換說明以%號開始,然后依次出現下列元素:
(1)0個或多個標志字符:-,+,0,#或空格,修改轉換操作的含義
(2)可選的最小字段寬度:表示為十進制整數常量
(3)可選的精度說明:表示為小數點加一個十進制整數
(4)可選的長度說明符:有ll,l,L,h,hh,j,z或t
(5)轉換操作:a,A,c,d,e,E,f,g,G,i,n,o,p,s,u,x,X或%。
常用的轉換操作:%d,%12d,%u,%o,%c,%s,%p,%f,%e,%%。
12、vfprintf,vprintf,vsprintf,vfscanf,vscanf,vsscanf,vfwprintf,vwprintf,vswprintf,vfwscanf,vwscanf,vswscanf:與上面的printf和scanf系列類似,只不過不是用省略號作為可變參數,而用stdarg.h中的va_list類型作為一個參數,這就允許編程人員定義自己的格式化輸入輸出函數。
13、fread,fwrite:從流中讀取count個指定長度的元素到數組中、把數組中的count個指定的長度的元素寫入到流中,返回實際讀取或寫入的項數。
14、feof,ferror,clearerr:判斷流是否到達末尾(到達返回非0,沒到達返回0)、返回流的錯誤狀態(有錯誤返回非0,沒錯誤返回0)、清除流中的任何文件結束標志或錯誤標志。
15、remove,rename:刪除指定文件、重命名指定文件。
16、tmpfile,tmpnam,L_tmpnam,TMP_MAX:tmpfile生成一個臨時文件并以可讀方式打開,文件關閉或程序終止時文件會被刪除、tmpnam生成一個不與當前各個文件名沖突的新文件名,保存在參數buf中、L-tmpnam為buf的最小字符個數、TMP_MAX為連續調用tmpnam的最大次數,不小于25。
17、perror:打印保存在errno全局變量中的當前錯誤碼的消息描述。
每個標準I/O函數的代碼并不長,因為glibc在內部實現了一個基本的I/O庫,標準I/O函數都是調用這些內部函數來完成工作的。所有的內部函數接口都在iolibio.h中聲明,基本上每個標準I/O函數都對應一個內部函數。內部函數名在標準函數名前加了__IO_字樣,數據流類型也使用內部__IO_FILE類型,標準的FILE類型就是直接用__IO_FILE類型定義的。libio.h中則聲明了一些內部實現需要使用的類型和常量,strfile.h聲明了與緩沖區、緩沖字符有關的一些特性。
新聞熱點
疑難解答
圖片精選