免费注册 查看新帖 |

Chinaunix

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

[C] 关于putc [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 18:43 |只看该作者 |倒序浏览
C程序设计语言第八章155页:
  1. #define putc(x, p) (--(p)->cnt >= 0 ? *(p)->ptr++ = (x) :  _flushbuf((x), p))
复制代码
cnt不是指缓冲区内剩余到字符数吗,  *(p)->ptr++ = (x)将x写入缓冲区之后cnt不应该增加吗?怎么还减减了呢--(p)->cnt >= 0

论坛徽章:
0
2 [报告]
发表于 2010-12-27 22:36 |只看该作者
仅从代码来看,是剩余的空间数,也就是剩余的空间还能容放的字符数。

论坛徽章:
0
3 [报告]
发表于 2010-12-29 21:24 |只看该作者
应该是判断输入流缓存是否满了 如果满了 执行 覆盖操作 如果未满 直接将字符放入

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2010-12-30 10:32 |只看该作者
cnt应该是count吧

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
5 [报告]
发表于 2010-12-30 11:05 |只看该作者
回复 1# lambert_fan


    我觉得2,3楼说的是,不过我查了下,cnt到底是个啥呢
  1. 在"stdio.h"中有如下定义
  2. struct _iobuf {
  3.         char *_ptr;   //文件输入的下一个位置
  4.         int   _cnt;  //当前缓冲区的相对位置
  5.         char *_base;  //指基础位置(即是文件的其始位置)
  6.         int   _flag;  //文件标志
  7.         int   _file;   //文件的有效性验证
  8.         int   _charbuf;  //检查缓冲区状况,如果无缓冲区则不读取
  9.         int   _bufsiz;   //文件的大小
  10.         char *_tmpfname;  //临时文件名
  11.         };
  12. typedef struct _iobuf FILE;
复制代码
这里说的是当前缓冲区的相对位置,这个相对如何理解呢?

论坛徽章:
0
6 [报告]
发表于 2011-01-12 21:59 |只看该作者
回复 5# rubylc_unix


    据我现在的理解,cnt指缓冲区内剩余到字符数,对于_fillbuf和_flushbuf有不同到意思,在fillbuf中指已存入缓冲区的字符数,在flushbuf中指缓冲区剩余的空位置,原代码如下:
  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <stdlib.h>

  4. #undef NULL
  5. #define NULL 0
  6. #define EOF (-1)
  7. #define BUFSIZ 1024
  8. #define OPEN_MAX 20

  9. enum _flags {
  10.         _READ = 01,
  11.         _WRITE = 02,
  12.         _UNBUF = 04,
  13.         _EOF = 010,
  14.         _ERR = 020,
  15. };

  16. typedef struct _iobuf {
  17.         int cnt;
  18.         char *ptr;
  19.         char *base;
  20.         int flag;
  21.         int fd;
  22. } FILE;

  23. extern FILE _iob[OPEN_MAX];

  24. FILE _iob[OPEN_MAX] = {
  25.         {0, (char *)0, (char *)0, _READ, 0},
  26.         {0, (char *)0, (char *)0, _WRITE, 1},
  27.         {0, (char *)0, (char *)0, _WRITE | _UNBUF, 2},
  28. };

  29. #define stdin (&_iob[0])
  30. #define stdout (&_iob[1])
  31. #define stderr (&_iob[2])

  32. int _fillbuf(FILE *);
  33. int _flushbuf(int, FILE *);

  34. #define feof(p) (((p)->flag & _EOF) != 0)
  35. #define ferror(p) (((p)->flag & _ERR) != 0)
  36. #define fileno(p) ((p)->fd)

  37. #define getc(p) (--(p)->cnt >= 0 \
  38.                 ? (unsigned char)*(p)->ptr++ : _fillbuf(p))
  39. #define putc(x,p) (--(p)->cnt >= 0 \
  40.                 ? *(p)->ptr++ = (x) : _flushbuf((x), p))

  41. #define getchar() getc(stdin)
  42. #define putchar(x) putc((x), stdout)

  43. #define PERMS 0777

  44. FILE *fopen(char *name, char *mode)
  45. {
  46.         int fd;
  47.         FILE *fp;

  48.         if (*mode != 'r' && *mode != 'w' && *mode != 'a')
  49.                 return NULL;
  50.         for (fp = _iob; fp < _iob + OPEN_MAX; fp++)
  51.                 if ((fp->flag & (_READ | _WRITE)) == 0)
  52.                         break;
  53.         if (fp >= _iob + OPEN_MAX)
  54.                 return NULL;

  55.         if (*mode == 'w')
  56.                 fd = creat(name, PERMS);
  57.         else if (*mode == 'a') {
  58.                 if ((fd = open(name, O_WRONLY)) == -1)
  59.                         fd = creat(name, PERMS);
  60.                 lseek(fd, 0L, 2);
  61.         } else
  62.                 fd = open(name, O_RDONLY, 0);
  63.         if (fd == -1)
  64.                 return NULL;
  65.         fp->fd = fd;
  66.         fp->cnt = 0;
  67.         fp->base = NULL;
  68.         fp->flag = (*mode == 'r') ? _READ : _WRITE;
  69.         return fp;
  70. }

  71. int _fillbuf(FILE *fp)
  72. {
  73.         int bufsize;

  74.         if ((fp->flag & (_READ | _EOF | _ERR)) != _READ)
  75.                 return EOF;
  76.         bufsize = (fp->flag & _UNBUF) ? 1 : BUFSIZ;
  77.         if (fp->base == NULL)
  78.                 if ((fp->base = (char *)malloc(bufsize)) == NULL)
  79.                         return EOF;
  80.         fp->ptr = fp->base;
  81.         fp->cnt = read(fp->fd, fp->ptr, bufsize);
  82.         if (--fp->cnt < 0) {
  83.                 if (fp->cnt == -1)
  84.                         fp->flag |= _EOF;
  85.                 else
  86.                         fp->flag |= _ERR;
  87.                 fp->cnt = 0;
  88.                 return EOF;
  89.         }
  90.         return (unsigned char) *fp->ptr++;
  91. }

  92. int _flushbuf(int x, FILE *fp)
  93. {
  94.         unsigned nc;
  95.         int bufsize;

  96.         if (fp < _iob || fp > _iob + OPEN_MAX)
  97.                 return EOF;
  98.         if ((fp->flag & (_WRITE | _ERR)) != _WRITE)
  99.                 return EOF;
  100.         bufsize = (fp->flag & _UNBUF) ? 1 : BUFSIZ;
  101.         if (fp->base == NULL) {
  102.                 if ((fp->base = (char *)malloc(bufsize)) == NULL) {
  103.                         fp->flag |= _ERR;
  104.                         return EOF;
  105.                 }
  106.         } else {
  107.                 nc = fp->ptr - fp->base;
  108.                 if (write(fp->fd, fp->base, nc) != nc) {
  109.                         fp->flag |= _ERR;
  110.                         return EOF;
  111.                 }
  112.         }
  113.         fp->ptr = fp->base;
  114.         *fp->ptr++ = x;
  115.         fp->cnt = bufsize - 1;

  116.         return x;

  117. }

  118. int main()
  119. {
  120.         FILE *fp;
  121.         int c;

  122.         if ((fp = fopen("test.c", "r")) == NULL)
  123.                 return EOF;
  124.         while ((c = getc(fp)) != EOF) {
  125.                 //write(1, &c, 1);
  126.                 putchar(c);
  127.         }
  128. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP