?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
在頭文件<stdio.h>中定義 | ||
---|---|---|
int ungetc(int ch,F(xiàn)ILE * stream); |
如果ch
不等于EOF
,則將字符ch
(重新解釋為unsigned char
)推入與流相關(guān)聯(lián)的輸入緩沖區(qū),stream
以便后續(xù)讀取操作stream
將檢索該字符。與流關(guān)聯(lián)的外部設(shè)備不會(huì)被修改。
流重新定位操作fseek
,fsetpos
并rewind
丟棄效果ungetc
。
如果ungetc
在沒(méi)有插入讀取或重新定位的情況下多次調(diào)用,則可能會(huì)失敗(換句話說(shuō),保證大小為1的推回緩沖區(qū),但是任何較大的緩沖區(qū)都是實(shí)現(xiàn)定義的)。如果ungetc
執(zhí)行了多個(gè)成功操作,則讀取操作將按照相反的順序檢索后退字符ungetc
。
如果ch
等于EOF
,則操作失敗并且流不受影響。
成功調(diào)用以ungetc
清除文件狀態(tài)標(biāo)志的結(jié)尾feof
。
成功調(diào)用ungetc
二進(jìn)制流將流位置指示符遞減1(如果流位置指示符為零,則行為不確定)。
ungetc
在文本流上的成功調(diào)用以未指定的方式修改流位置指示符,但保證在用讀取操作檢索到所有后推字符后,流位置指示符等于其之前的值ungetc
。
CH | - | 字符被壓入輸入流緩沖區(qū) |
---|---|---|
流 | - | 文件流將字符放回 |
成功則返回ch
。
失敗時(shí)EOF
返回并且給定的流保持不變。
推回緩沖區(qū)的大小實(shí)際上從4k(Linux,MacOS)到4(Solaris)或保證的最小1(HPUX,AIX)不等。
如果推回的字符等于外部字符序列中存在于該位置的字符(實(shí)現(xiàn)可簡(jiǎn)單地遞減讀取文件位置指示符并避免維持推回緩沖區(qū)),則推回緩沖區(qū)的表觀大小可較大。
演示了ungetc的最初目的:實(shí)現(xiàn)scanf。
#include <ctype.h>#include <stdio.h> void demo_scanf(const char* fmt, FILE* s) { if(*fmt == '%') { int c; switch(*++fmt) { case 'u': while(isspace(c=getc(s))) {} // skip leading white space unsigned int num = 0; while(isdigit(c)) { num = num*10 + c-'0'; c = getc(s); } printf("%%u scanned %u\n", num); ungetc(c, s); // reprocess the non-digit case 'c': c = getc(s); printf("%%c scanned '%c'\n", c); } } } int main(void){ FILE* f = fopen("input.txt", "w+"); fputs("123x", f); rewind(f); demo_scanf("%u%c", f); fclose(f);}
輸出:
%u scanned 123%c scanned 'x'
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.21.7.10 ungetc函數(shù)(p:334)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.19.7.11 ungetc函數(shù)(p:300)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.9.7.11 ungetc函數(shù)