字符返回函数ungetc()函数,请高手进来指点

来源:百度知道 编辑:UC知道 时间:2024/05/30 03:56:06
#include<stdio.h>
#include<stdlib.h>
void main(void)
{
FILE *fp;
FILE *p;
int ch,c;
if((fp=fopen("F:\\wangyong.txt","r"))==NULL)
{
printf("error");
exit(1);
}
if((p=fopen("F:\\xiaowen.txt","r"))==NULL)
{
printf("error");
exit(1);
}
while((ch=getc(fp))!=EOF)
{
ungetc(ch,p);

}
rewind(p);
while((c=getc(p))!=EOF)
{
putc(c,stdout);
}

if(fclose(fp)!=0&&fclose(p)!=0)
exit(1);

}
这是一个返回字符的小程序,为什么这个程序会什么都不输出,如果去掉rewind(p)这句可以输出一个字符,为什么呢?还有请帮我详细解析下ungetc()函数的用法,本人一直感觉很模糊,它具体的作用是什么?它是不是只要是输入文件就可以返回到该文件中,还是只能返回到字符本身所在的输入文件?
最好是举例说明下

ungetc是将读出的数据再次放回到缓冲区去,下一次读数据时,会再次读出来的。
不过如果把读出的数据放回到缓冲区去后,没有将缓冲区的数据读出来 就再次试图把读出的数据放回到缓冲区去---数据是放不进去的 (可以把缓冲区看做一个可变化的容器,当你把试图用ungetc()函数把读出的数据放回到缓冲区,缓冲区这个容器就为这些数据分配相应的大小空间,之后这个空间是不变的,直到你把缓冲区的数据读出去,所以你在没有释放缓冲区时,再次想往缓冲区装数据是装不进去的)

你可以比较程序一与程序二运行的结果证明上面的结论

程序一:
#include <stdio.h>

int main (int argc, char **argv)
{
ungetc ('\n', stdin);
printf ("%c", getc(stdin));

ungetc ('a', stdin);
printf ("%c", getc(stdin));

ungetc ('b', stdin);
printf ("%c", getc(stdin));

ungetc ('c', stdin);
printf ("%c", getc(stdin));

return 0;
}

程序二:
#include <stdio.h>;
int main (int argc, char **argv)
{

ungetc ('c', stdin);
ungetc ('b', stdin);
ungetc ('a', stdin);
ungetc ('\n', stdin);

printf (&quo