想知道这个函数具体怎么实现的看了一下源码
int putc (int c, FILE * __F)
{
return (--F->cnt >= 0)
? (int) (unsigned char) (*_F->ptr++ = (char)_c)
: flsbuf (_c, __F);
}
除了看懂条件运算符?外,其他的都没遇见过,能解释一下吗?
想知道这个函数具体怎么实现的看了一下源码
int putc (int c, FILE * __F)
{
return (--F->cnt >= 0)
? (int) (unsigned char) (*_F->ptr++ = (char)_c)
: flsbuf (_c, __F);
}
除了看懂条件运算符?外,其他的都没遇见过,能解释一下吗?
在吗
解释:真正在做putc的事情的是*_F->ptr++ = (char)_c。
F是FILE*类型的,所以*F->ptr就是F的ptr属性。为了很好的解释这一点,现将FILE类型解释一下:
struct _iobuf {
char *ptr; //下一个字符地址
int cnt; //剩余内存地址
char *base; //起始的内存地址
int flag; //描述状态(读写)
int fd; //描述符
};
我们真正需要的是前三个。如果你输出了3个字符是“123”,‘1’的内存地址就是base,‘3’的地址的下一个地址就是ptr。如果你的输出流最多可以输出5个字符,而你输出了3个字符,cnt的值就是5-3=2.
flsbuf (_c, __F)做的是什么呢?
很简单,在流的内存不够时"冲刷”缓存,也就是复位缓存。