ungetc
函数 <cstdio>
int ungetc ( int character, FILE * stream );
返还从流中获取的字符
character实际上被放回输入流,回退其内部文件的位置,就像之前的
getc操作被撤消一样。
这个字符可以是也可以不是前一个输入操作中从流中读取的那个字符。
在任何情况下,从流中检索的下一个字符都与character无关。
但是请注意,这只会影响流上进一步的输入操作,而不会影响与之关联的物理文件的内容,
对该函数的任何调用都不会修改物理文件的内容。
一些标准库实现可能支持多次调用该函数,使字符按放回原处的相反顺序可用。
尽管这种行为没有标准的可移植性保证,而且在第一次调用之后的任意次数调用都可能失败。
如果成功,函数将清除stream的文件结束指示符(如果当前设置了该指示符),如果在二进制模式下操作,
则将其内部文件位置指示符减1;在文本模式下,位置指示器具有未指定的值,直到所有用ungetc放回的字符被读取或丢弃。
对stream调用
fseek、
fsetpos
或
rewind将丢弃之前用该函数放回的任何字符。
如果为字符形参传递的实参是
EOF,则操作失败,输入流保持不变。
☲ 参数
character
将字符的int转换放回原处。
当放回该值时,该值将在内部转换为unsigned char。
stream
指向标识输入流的
FILE对象的指针。
☉ 返回值
一旦成功,填充的角色就会被返回。
如果操作失败,则返回
EOF。
☣ 示例
/* 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的现有文件来读取并打印,
但是首先获取每一行的第一个字符并将它放回流中,用@替换任何开始的#。
🍄 另请参阅
fgetc |
从流中获取字符(function ) |
putc |
将字符写入流(function ) |
getc |
从流中获取字符(function ) |