ungetc()函数采用单个字符并将其推回到输入流中。它与getc()函数相反,后者从输入流中读取单个字符。另外,ungetc()是输入函数,而不是输出函数。
用法:
int ungetc(int char, FILE *stream)
参数:
- char:指定要放回的字符的int提升。放回时,该值在内部转换为无符号字符。
- stream:指定指向标识输入流的FILE对象的指针。
返回值:该函数返回两种值。
- 成功时,ungetc()函数将返回字符ch。
- 失败时,将返回EOF而不更改流。
有关该函数的要点:
- ungetc()函数将char指定的字节(转换为无符号char)推回到stream指向的输入流上。
- pushed-back字节由该流上的后续读取按其推送的相反顺序返回。
- 对file-positioning函数(fseek(),fsetpos()或rewind())的成功介入调用(流指向该流)将丢弃该流的任何pushed-back字节。
- 与该流相对应的外部存储器应保持不变。
- 成功调用ungetc()会清除流的end-of-file指示器。
- 读取或丢弃所有pushed-back字节后,流的file-position指示符的值应与推回字节之前的值相同。
- 每次成功调用ungetc()都会使file-position指标递减,如果在调用前其值为0,则在调用后未指定其值。
以下示例程序旨在说明上述函数。
示例1:
#include <stdio.h>
int main()
{
FILE* f;
int char;
char buffer[256];
// read a file
f = fopen("use1.txt", "r");
// when no data
if (f == NULL) {
printf("Error in opening file");
return (-1);
}
// read lines till end
while (!feof(f)) {
// get line
char = getc(f);
// replace ! with +
if (char == '!') {
ungetc('+', f);
}
// if not
else {
ungetc(c, f);
}
fgets(buffer, 255, f);
fputs(buffer, stdout);
}
return 0;
}
假设我们有一个文本文件use1.txt,其中包含以下数据。该文件将用作示例程序的输入,然后输入和输出如下所示:
Input: !c standard library !library function stdio.h-ungetc() Output: +c standard library +library function stdio.h-ungetc()
示例2:
// C program for taking input till we
// get 1 at the input
#include <stdio.h>
int main()
{
int ch;
// reads characters from the stdin and show
// them on stdout until encounters '1'
while ((ch = getchar()) != '1')
putchar(ch);
// ungetc() returns '1' previously
// read back to stdin
ungetc(ch, stdin);
// getchar() attempts to read
// next character from stdin
// and reads character '1' returned
// back to the stdin by ungetc()
ch = getchar();
// putchar() displays character
putchar(ch);
return 0;
}
相关用法
注:本文由纯净天空筛选整理自Swati Bararia大神的英文原创作品 ungetc() in C/C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。