函数
<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的现有文件进行读取并打印其行,但首先获取每行的第一个字符并将其放回流中,将任何开头的#替换为@.

另见