当前位置: C语言 -- 标准库 -- <stdio.h> -- ungetc

ungetc函数


概要:
#include <stdio.h>
int ungetc(int c, FILE *stream);

描述:

该函数将参数c指定的字符转换为unsigned char类型,推回参数stream指向的输入流。通过后续从输入流中读取输入,推回的字符将按推回顺序逆序返回。成功调用文件位置函数(例如:fseekfsetposrewind函数。)将会丢弃推回输入流的字符。通过调用ungetc函数将字符推回输入流,会影响流的内部缓冲;但不会改变与流相关联的外部文件的内容。

使用ungetc函数推回一个字符是有保证的。如果未对流进行读取操作或者文件定位操作,对同一输入流多次调用ungetc函数,操作可能会失败。

如果参数c的值等于宏EOF,操作会失败,并且输入流保持不变。

成功调用ungetc函数会清除流的文件末尾指示符(end-of-file indicator)。流的文件位置指示符(file position indicator)在读取或者丢弃所有推回字符后与推回字符前相同。对于文本流,成功调用ungetc函数后文件位置指示符的值是不明确的,直至所有推回字符被读取或者被丢弃。对于二进制流,每次成功调用ungetc函数,文件位置指示符将递减;如果调用ungetc函数前,文件位置指示符的值为0,调用ungetc函数后,文件位置指示符的值是不确定的。


参数:
int c

int类型整数,会转换为unsigned char类型。

FILE *stream

指向推回字符的输入流的指针。


返回值:

如果调用成功,函数返回转换后推回输入流的字符;如果调用失败,函数返回EOF


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
/*函数ungetc范例*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *pFile;
    int ch;

    pFile = fopen("gch.txt", "r");
    if(!pFile)
    {
        perror("Error");
        exit(EXIT_FAILURE);
    }

    /*将#替换为$后,输出文件内容。*/
    while((ch=getc(pFile)) != EOF)
    {
        /*将#替换为$。*/
        if(ch=='#')
            ungetc('$', pFile);
        else
            ungetc(ch, pFile);

        /*输出替换过的文件内容。*/
        ch = getc(pFile);
        putchar(ch);
    }
    
    fclose(pFile);

    return 0;
}


结果:

假设文件gch.txt的内容为:

#first #second

#third

将输出:

$first $second

$third

:程序执行后,文件gch.txt的内容保持不变,仍然为:

#first #second

#third


相关内容:
fgets 从输入流读取字符串的函数。
getc 从输入流读取字符的函数。
getchar 从标准输入流读取字符的函数。
fgetc 从输入流读取字符的函数。