免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2390 | 回复: 7
打印 上一主题 下一主题

看《the C programming language》的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-06 21:30 |只看该作者 |倒序浏览
看到第8章getc的实现时,书中有
typedef struct _iobuf {
    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;

#define getc(p)     (--(p)->cnt >= 0 ?  (unsigned char) *(p)->ptr++ : _fillbuf(p))
#define putc(x,p)  (--(p)->cnt >= 0 ?  *(p)->ptr++ = (x) : _flushbuf((x),p))

为什么getc和putc的条件操作符的条件都是检查FILE指针的cnt值是否大于0?我觉得putc(x,p) 应该是
(++(p)->cnt <= bufsize之类的,因为每putc一个字符,缓冲区中的字符就多了一个,这样FILE.cnt的定义才能统一。望牛人解答

论坛徽章:
0
2 [报告]
发表于 2008-10-06 22:27 |只看该作者

回复 #1 anselcat 的帖子

没有上下文语境...
不过估摸着看看应该没问题阿,不管是putc还是getc,cnt--和ptr++倒是一致的
注释里面说cnt是characters left,那么cnt应该是越写越少,你为什么想用(++(p)->cnt呢?

论坛徽章:
0
3 [报告]
发表于 2008-10-06 22:42 |只看该作者
恩,cnt应该是当前字符指针位置和Buffer右边界之间的字符数,假设Buffer是向右增长。
这样如果(p)->cnt  == 0,就说明指针到了最右边界,也就是buf用完了。

cnt应该并非指Buffer中剩下的“可用”的字符总数。

论坛徽章:
0
4 [报告]
发表于 2008-10-08 11:30 |只看该作者

回复 #3 kiffa 的帖子

为什么getc里cnt的含义是buffer中剩下的字符数,到了putc里就变成了buffer中剩下的空位数了?感觉有些矛盾啊

论坛徽章:
0
5 [报告]
发表于 2008-10-08 14:05 |只看该作者
原帖由 anselcat 于 2008-10-8 11:30 发表
为什么getc里cnt的含义是buffer中剩下的字符数,到了putc里就变成了buffer中剩下的空位数了?感觉有些矛盾啊


那本书上已经说得很清楚了

getc是取,取走一个少一个,当然要判断剩下的字符数了。
putc是往里放,当然要判断还有多少buffer空间可以用。

论坛徽章:
0
6 [报告]
发表于 2008-10-09 09:48 |只看该作者
那对一个文件先进行putc再进行getc,cnt的含义一会儿变成剩下的buffer数,一会儿变成剩下的字符数,互相不能配合啊。比如bufsize是8,先putc8个字符,这样剩下的空位是0,cnt值也是0,再getc的话会判断字符数也为0,应为cnt的含义对getc来说是buf中剩下的字符数

论坛徽章:
0
7 [报告]
发表于 2008-10-09 10:18 |只看该作者
原帖由 anselcat 于 2008-10-9 09:48 发表
那对一个文件先进行putc再进行getc,cnt的含义一会儿变成剩下的buffer数,一会儿变成剩下的字符数,互相不能配合啊。比如bufsize是8,先putc8个字符,这样剩下的空位是0,cnt值也是0,再getc的话会判断字符数也 ...


怎么会矛盾呢?

你对一个文件先进行putc再进行getc,这是调用两个不同的函数,cnt只是P的一个成员。

你看这两个函数的原型(也就是原书中的宏定义)

getc(P)
putc(X,P),这两个P在你说的应用中是不一样的啊。所以cnt的含义也不一样。

论坛徽章:
0
8 [报告]
发表于 2008-10-09 22:59 |只看该作者
p是FILE*类型啊 打开同一个文件得到的p是指向同一个FILE结构的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP