了解K&R的putc宏:K&R第8章(Unix系统接口)练习2
我一直试图了解K& R的putc版本已经有一段时间了,而且我没有资源(google,堆栈溢出,clcwiki没有我想要的东西,我没有朋友或同事求助于).我先解释一下背景,然后要求澄清.
本章的这一章介绍了描述文件的数据结构示例.该结构包括用于一次读取和写入大块的字符缓冲区.然后他们要求读者写一个标准库putc的版本. 作为读者的线索,K& R编写了一个支持缓冲和非缓冲读取的getc版本.他们还编写了putc宏的骨架,让用户自己编写函数_flushbuf(). putc宏看起来像这样(p是指向文件结构的指针): int _flushbuf(int,FILE *); #define putc(x,p) (--(p)->cnt >= 0 ? *(p)->ptr++ = (x) : _flushbuf((x),p) typedef struct { int cnt; /*characters left*/ char *ptr; /*next character position*/ char *base; /*location of buffer*/ int flag; /*mode of file access*/ int fd; /*file descriptor*/ } FILE; 令人困惑的是,宏中的条件实际上是测试结构的缓冲区是否已满(这在文中说明) – 作为旁注,getc中的条件完全相同但意味着缓冲区为空.奇怪的? 这是我需要澄清的地方:我认为putc中的缓冲写入存在一个相当大的问题;因为写入p只在_flushbuf()中执行,但_flushbuf()仅在文件结构的缓冲区已满时调用,然后只有在缓冲区完全填满时才进行写入.缓冲读数的大小始终是系统的BUFSIZ.除了’BUFSIZ’字符之外的任何其他内容都不会发生,因为_flushbuf()永远不会在putc中调用. putc适用于无缓冲写入.但是宏的设计使得缓冲写入几乎完全没有意义.这是正确的,还是我在这里遗漏了什么?为什么会这样?我非常感谢这里的所有帮助. 解决方法
如果写得足够多,缓冲区最终会变满.如果不这样做,您最终将关闭该文件(或者运行时将在main()返回时为您执行此操作)并且fclose()调用_flushbuf()或其等效文件.或者你将手动fflush()流,这也相当于_flushbuf().
如果你要写几个字符然后调用sleep(1000),你会发现很长一段时间都没有打印出来.这确实是它的工作方式. getc和putc中的测试是相同的,因为在一种情况下,计数器记录可用的字符数,在另一种情况下,它记录可用的空间量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |