亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4066 | 回復(fù): 5
打印 上一主題 下一主題

[C] 關(guān)于putc [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-12-27 18:43 |只看該作者 |倒序?yàn)g覽
C程序設(shè)計(jì)語言第八章155頁:
  1. #define putc(x, p) (--(p)->cnt >= 0 ? *(p)->ptr++ = (x) :  _flushbuf((x), p))
復(fù)制代碼
cnt不是指緩沖區(qū)內(nèi)剩余到字符數(shù)嗎,  *(p)->ptr++ = (x)將x寫入緩沖區(qū)之后cnt不應(yīng)該增加嗎?怎么還減減了呢--(p)->cnt >= 0

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-12-27 22:36 |只看該作者
僅從代碼來看,是剩余的空間數(shù),也就是剩余的空間還能容放的字符數(shù)。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-12-29 21:24 |只看該作者
應(yīng)該是判斷輸入流緩存是否滿了 如果滿了 執(zhí)行 覆蓋操作 如果未滿 直接將字符放入

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報(bào)曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀(jì)念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達(dá)阿赫利
日期:2015-07-03 08:39:42
4 [報(bào)告]
發(fā)表于 2010-12-30 10:32 |只看該作者
cnt應(yīng)該是count吧

論壇徽章:
1
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34
5 [報(bào)告]
發(fā)表于 2010-12-30 11:05 |只看該作者
回復(fù) 1# lambert_fan


    我覺得2,3樓說的是,不過我查了下,cnt到底是個(gè)啥呢
  1. 在"stdio.h"中有如下定義
  2. struct _iobuf {
  3.         char *_ptr;   //文件輸入的下一個(gè)位置
  4.         int   _cnt;  //當(dāng)前緩沖區(qū)的相對(duì)位置
  5.         char *_base;  //指基礎(chǔ)位置(即是文件的其始位置)
  6.         int   _flag;  //文件標(biāo)志
  7.         int   _file;   //文件的有效性驗(yàn)證
  8.         int   _charbuf;  //檢查緩沖區(qū)狀況,如果無緩沖區(qū)則不讀取
  9.         int   _bufsiz;   //文件的大小
  10.         char *_tmpfname;  //臨時(shí)文件名
  11.         };
  12. typedef struct _iobuf FILE;
復(fù)制代碼
這里說的是當(dāng)前緩沖區(qū)的相對(duì)位置,這個(gè)相對(duì)如何理解呢?

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-01-12 21:59 |只看該作者
回復(fù) 5# rubylc_unix


    據(jù)我現(xiàn)在的理解,cnt指緩沖區(qū)內(nèi)剩余到字符數(shù),對(duì)于_fillbuf和_flushbuf有不同到意思,在fillbuf中指已存入緩沖區(qū)的字符數(shù),在flushbuf中指緩沖區(qū)剩余的空位置,原代碼如下:
  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. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP