函式
<cstdio>

ungetc

int ungetc ( int character, FILE * stream );
從流中退回一個字元
一個字元被虛擬地放回輸入中,使其內部檔案位置減少,就好像撤銷了前一個 getc 操作一樣。

字元可能與前一個輸入操作中從中讀取的字元相同,也可能不同。無論如何,下一個從中獲取的字元是傳遞給此函式的字元,而與原始字元無關。

但是請注意,這隻影響該上後續的輸入操作,而不會影響與其關聯的物理檔案的內容,物理檔案的內容不會因呼叫此函式而修改。

某些庫實現可能支援多次呼叫此函式,使得這些字元以它們被放回的相反順序可用。雖然這種行為沒有標準的可移植性保證,並且在第一次呼叫之後,任何數量的後續呼叫都可能簡單地失敗。

如果成功,該函式會清除檔案結束指示符(如果當前已設定),並在二進位制模式下操作時遞減其內部檔案位置指示符;在文字模式下,位置指示符的值是未指定的,直到所有被放回的字元ungetc已被讀取或丟棄。

上呼叫 fseekfsetposrewind 將丟棄之前用此函式放回的任何字元。

如果為字元引數傳遞的引數是 EOF,則操作失敗,輸入保持不變。

引數

character
要放回的字元的int提升。
該值在放回時被內部轉換為unsigned char
stream
指向標識輸入流的 FILE 物件的指標。

返回值

成功時,返回被放回的字元
如果操作失敗,則返回 EOF

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* ungetc example */
#include <stdio.h>

int main ()
{
  FILE * pFile;
  int c;
  char buffer [256];

  pFile = fopen ("myfile.txt","rt");
  if (pFile==NULL) perror ("Error opening file");
  else while (!feof (pFile)) {
    c=getc (pFile);
    if (c == EOF) break;
    if (c == '#') ungetc ('@',pFile);
    else ungetc (c,pFile);
    if (fgets (buffer,255,pFile) != NULL)
      fputs (buffer,stdout);
    else break;
  }
  return 0;
}

此示例開啟一個名為myfile.txt的現有檔案進行讀取並列印其行,但首先獲取每行的第一個字元並將其放回流中,將任何開頭的#替換為@.

另見