ungetc
ungetc是将读出的数据再次放回到缓冲区去,下一次读数据时,会再次读出来的。不过如果把读出的数据放回到缓冲区去后,没有将缓冲区的数据读出来 就再次试图把读出的数据放回到缓冲区去---数据是放不进去的 (可以把缓冲区看做一个可变化的容器,当你把试图用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 ("%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();
}
更多推荐
所有评论(0)