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

#include<stdio.h>#include<stdlib.h>voidmain(void){FILE*fp;FILE*p;intch,c;if((fp=fopen... #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()函数的用法,本人一直感觉很模糊,它具体的作用是什么?它是不是只要是输入文件就可以返回到该文件中,还是只能返回到字符本身所在的输入文件?
最好是举例说明下
展开
 我来答
百度网友6fbb07114
推荐于2018-04-07 · 超过10用户采纳过TA的回答
知道答主
回答量:19
采纳率:0%
帮助的人:0
展开全部
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 ("%c", getc(stdin));
printf ("%c", getc(stdin));
printf ("%c", getc(stdin));
printf ("%c", getc(stdin));

return 0;
}

如果去掉rewind(p)这句可以输出一个字符 ,是的,输出时优先考虑缓冲区的数据的输出。

rewind(p)定位到文件的开始,当然只会输出文件里面的内容。

至于你要用上面的代码实现你说的功能 (这是一个返回字符的小程序)可以考虑把while {//code}改成这样

while((ch=fgetc(fp))!=EOF)
{
ungetc(ch,p);
c=getc(p);
putc(c,stdout);
}

至于ungetc()函数的作用 个人观点:当你从流中读出字符,但却不是你需要的内容时,为了不改流的内容(也许此流另外有用),需要回写进流。写回后再读,仍会读出来
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式