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()函数的作用  个人观点:当你从流中读出字符,但却不是你需要的内容时,为了不改流的内容(也许此流另外有用),需要回写进流。写回后再读,仍会读出来

 

 

 

 

isprint

原型: int isprint(char ch);

功能: 判断字符c是否为可打印字符(含空格)

说明: 当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零

 

举例:

void print(char c)
{
    if (isprint(c)) printf("%c:是可打印字符/n",c);
    else printf("%c:不是可打印字符/n",c); 
}

void main()
{
    SetScreen(0);
    print('a');
    print(' ');
    print(0x7f);
    getchar();
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐