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宣告了與緩衝區、緩衝字元有關的一些特性。
輸入輸出標頭檔案等規範
1.char a 10 scanf s a 如果想讓輸入字串的首字元從a 1 開始儲存 scanf s a 1 char b 10 5 for int i 0 i 10 i 主函式呼叫 call a,n 被呼叫函式 void call int a 2 int n 9.scanf對於float型別必須...
檔案輸入 輸出
13.1 和檔案進行通訊 文字檢視和二進位制檢視 在文字檢視中,程式看到的內容和二進位制的內容可能不同,例如ms dos文字檔案用回車符和換行符的組合 r n來表示行尾,macintosh用乙個回車符 r來表示行尾。c程式使用乙個 n表示行尾。所以,如果c程式以文字檢視模式處理乙個ms dos文字檔...
檔案輸入輸出
檔案的兩種檢視 文字和二進位制。有的時候同乙個檔案以不同的檢視進行檢視,顯示是不同的,主要是控制字元 回車,換行 的不同。printf 是將各種型別轉換為適合的終端字元。所以打算將乙個結構體送入檔案的話不能用printf這一類函式。二進位制形式儲存,中間沒有從數字到字串形式的轉化。對於標準io,fr...