接前文. 再来看看getc和ungetc的实现.在看这两个函数的实现之前,我们先来想一想这两个函数分别需要做的工作. int getc(FILE *stream) 说明:函数getc从stream指向的输入流中读取下一个字符(如果有的话),并把它由unsigned char类型转换为int类型,并且流的相关的文件定位符(如果定义的话)向前移动一位. 返回值:函数getc返回stream指向的输入流的下一个字符,如果流处于文件结束处,则设置该流的文件结束指示符,函数getc返回EOF.如果发生了读…
其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中获益颇丰. 输入输出模块 在20世纪60年代早期,FORTRAN IV被认为是独立于机器的语言.但是如果不作任何改动,根本不可能在各种计算机体系结构中移动FORTRAN IV程序.可移植性的主要障碍是输入输出领域.在FORTRAN IV中,可以对FORTRAN IV代码中间的I/O语句中对正在通信的…
花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_lk(_c,_stream) (--(_stream)->_cnt >= 0 ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream))) 看到这个宏是否觉得很熟悉,很像getc的宏吧. 那么,很容易产生一…
函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, char *type, FILE *stream); FILE * __cdecl _tfreopen ( const _TSCHAR *filename, const _TSCHAR *mode, FILE *str ) { REG1 FILE *stream; FILE *retval; _AS…
我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) *dest++ = *src++ ; *dest = *src; return reval; } MSVC: char * __cdecl strcat ( char * dst, const char * src ) { char * cp = dst; while( *cp ) cp++; /…
我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch && cnt <= count){cnt++;} if(cnt > count) return NULL; else return buf; } 红色部分报错. 该错误为为ANSIC中认定的错误,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的. 但是GNU则不这么…
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && !(reval = (*(unsigned char *)buf1) - (*(unsigned char *)buf2))) { buf1 = (unsigned ; buf2 = (unsigned ; --count; } return reval; } MS VC: int __cdecl memcm…
默默觉得原来的阅读笔记的名字太土了,改了个名字,叫做走进C标准库. 自己就是菜鸟一只,第一次具体看C标准库,文章参杂了对<the standard C library>的阅读和对源码的一些个人浅显理解,自己记录一下,日后有机会来看可能有另一番感悟吧. assert.h assert宏定义的两种表达方式: #define assert(exp) ((exp) ? (void)0 : _assert(msg)) #define assert(exp) (void)( (exp) || _asser…
先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突. 还是把头文件的内容都放在#ifndef和#endif中吧.不管你的头文件会不会被多个文件引用,你都要加上这个.一般格式是这样的: #ifndef <标识> #define <标识>…
是很多人学C语言接触的第一个头文件,顾名思义,stdio就是"标准输入输出",其中声明了一组关于输入输出的类型,宏和函数,其中就包括了打印著名的"hello,world!"的printf(),但是,这并不意味着这个头文件就很简单,相反,这个头文件是C标准库里唯二包罗万象的一个库(另一个是).好,让我们从头审视一下这个头文件 概念 文件描述符file descriptor 似于Windows系统的文件句柄,Unix/Linux系统用来描述文件的一个正整数,OS负责分发…