C standard library: stdio.h,ctype.h, stdlib.h, assert.h, stdarg.h, time.h
<stdio.h>: File operations
int remove(const char∗ filename)
• removes the file from the filesystem.
• retrn non-zero on error.
int rename(const char∗ oldname, const char∗ newname)
• renames file
• returns non-zero on error(reasons?: permission, existence)
第一次发现C的<stdio.h>中有这两个函数,一直觉得文件操作很复杂和神秘,现在看还是很简单的。不过底层应该会涉及到安全机制,尤其是在涉及到多种操作系统时,不同的安全策略也许会带来很大的麻烦。
<stdio.h>:Temporary files
FILE∗ tmpfile(void)
• creates a temporary file with mode "wb+".
• the file is removed automatically when program terminates.
char∗ tmpnam(char s[L_tmpnam])
• creates a string that is not the name of an existing file.
• return reference to internal static array if s is NULL. Populate s otherwise.
• generates a new name every call.
这个临时的命名用时间来命名是最合适的了。\
<stdio.h>: Raw I/O
size_t fread(void∗ ptr , size_t size, size_t nobj,FILE ∗stream)
• reads at most nobj items of sizesize from stream into ptr.
• returns the number of items read.
• feof and ferror must be used to test end of file.
size_t fwrite (const void∗ ptr,size_t size, size_t nobj,FILE ∗stream)
• write at most nobj items of size size from ptr onto stream.
• returns number of objects written.
fread使我想起了malloc时对所获得的内存进行强制类型转换,大概也是这个样子吧,将新的内存段按大小分,再登记下这段内存的类型。
<stdio.h>: File position
int fseek(FILE∗ stream, long offset, int origin )
• sets file position in the stream.Subsequent read/write begins at this location
• origin can be SEEK_SET, SEEK_CUR,SEEK_END.
• returns non-zero on error.
long ftell (FILE∗ stream)
• returns the current positionwithin the file. (limitation? long data type).
• returns -1L on error.
int rewind(FILE∗ stream)
• sets the file pointer at thebeginning.
• equivalent tofseek(stream,0L,SEEK_SET);
这几个函数用的多一些,记得上课时就学过。在进行文件流操作时,至少要记录文件的起始位置和当前文件指针的位置。
<stdio.h>: File errors
void clearerr (FILE∗ stream)
• clears EOF and other errorindicators on stream. int feof (FILE∗ stream)
int feof (FILE∗ stream)
• return non-zero (TRUE) if end offile indicator is set for stream.
• only way to test end of file forfunctions such as fwrite(),fread()
int ferror (FILE∗ stream)
• returns non-zero (TRUE) if anyerror indicator is set for stream.
<string.h>: Memory functions
void∗ memcpy(void∗ dst, const void∗ src, size_t n)
• copies n bytes from src to location dst
• returns a pointer to dst.
• src and dst cannot overlap.
void∗ memmove(void∗ dst, const void∗ src, size_t n)
• behaves same as memcpy() function.
• src and dst can overlap.
int memcmp(const void∗ cs,const void∗ ct,int n)
• compares first n bytes between cs and ct.
void∗ memset(void∗ dst, int c, int n)
• fills the first n bytes of dst with the value c.
• returns a pointer to dst
memcpy相对memmove最大的好处就是方便并行化处理吧。这两个名字起的很精彩,copy就是copy,move就是move。在设计类库时多考虑下数据的独立性是很好的编程习惯。
<stdlib.h>:Utility
double atof(const char∗ s)
int atoi (const char∗ s)
long atol(const char∗ s)
• converts character to float,integerand long respectively.
int rand()
• returns a pseduo-random numbersbetween 0 and RAND_MAX
void srand(unsigned int seed)
• sets the seed for thepseudo-random generator!
前面的几个函数实现起来好像并不难。就是整型转浮点的实现可能麻烦一些,我还想不到特别优雅的方法。
<stdlib.h>: Exiting
void abort(void)
• causes the program to terminateabnormally.
void exit ( int status)
• causes normal program termination.The value status is returned to the operating system.
• 0 EXIT_SUCCESS indicatessuccessful termination. Any other value indicates failure(EXIT_FAILURE)
void atexit (void (∗fcn )( void))
• registers a function fcn to becalled when the program terminates normally;
• returns non zero when registrationcannot be made.
• After exit() is called, the functions are called in reverse order of registration.
int system(const char∗ cmd)
• executes the command in string cmd.
• if cmd is not null, the program executes the command and returns exit status returned by the command
system这个函数好像python里面也有,并且在python里面用的很多。atexit的执行顺序为什么是逆序,实在想不通。
<stdlib.h>:Search and sort
void∗ bsearch(const void∗ key, const void∗ base, size_t n,size_t size, int(∗cmp)(const void∗ keyval, const void∗ datum));
• searches base[0] through base[n-1] for *key.
• function cmp() is used to perform comparison.
• returns a pointer to the matching item if it exists and NULLotherwise.
void qsort(void∗ base, size_t n, size_t sz, int(∗cmp)(constvoid∗, const void∗));
• sorts base[0] through base[n-1] in ascending/descending order.
• function cmp() is used to perform comparison.
搜索和排序中的比较函数指针是使用函数指针的一个典型例子。bsearch和qsearch如此常用,以至于很多编程语言的库函数都将其包含在内。
<assert.h>: Diagnostics
void assert(int expression)
• used to check for invariants/codeconsistency during debugging
• does nothing when expression istrue.
• prints an error message indicating, expression, filename and line number.
Alternative ways to print filename and line number during execution is to use: __FILE__,__LINE__ macros.
assert函数在发布为release时应该会去掉,现在也明白了为什么JUnit里面那么多assert打头的函数了。
<stdarg.h>:Variable argument lists
Variable argument lists:
• functions can variable number ofarguments.
• the data type of the argument canbe different for each argument.
• atleast one mandatory argument isrequired.
• Declaration:
int printf (char∗ fmt ,...); /∗fmt is last named argument∗/
va_list ap
• ap defines an iterator that willpoint to the variable argument.
• before using, it has to beinitialized using va_start.
C与Java、C#等运行在虚拟机中的解释性语言不同,是彻底的编译运行,因此这种动态特性是由预处理的宏来实现的。