C 标准库(一)

个人的 C 标准库手册,以 C++ 的观点重新认识 C 标准库(基本api)

  • 注意 C 标准库与标准 C 的区别。库函数的实现尽可能地使用标准 C,也即库函数的实现依赖标准 C。
函数 头文件 功能说明 补充
fputs <stdio.h> 输出字符数组到文件流 等价于C++中的std::ofstream
fput <stdio.h> 输出单个字节到文件流

对库的理解

库(library)是一个可以在许多程序中复用的程序组件的集合。大部分的程序设计语言都包含某种形式的库。

在程序中使用函数之前,必须先对它进行声明。最简单的办法是一个头文件(header)包含到程序中,该头文件声明了某种类别的所有库函数。头文件也可定义任何相关的类型定义(type definition)和宏(macro)。头文件(声明和类型定义)和函数本身都是库的组成部分。在大多数情况下,与构成程序的源代码一样,头文件也是文本文件(text file)。

C 程序员的评级

管窥见豹,可从对 C 标准库的正确和熟练地使用见 C 程序员的三个层次:

  • 合格程序员:<ctype.h>、<stdio.h>、<stdlib.h>、<string.h>

  • 熟练程序员:<assert.h>、<limits.h>、<stddef.h>、<time.h>

  • 优秀程序员:<float.h>、<math.h>、<error.h>、<locale.h><setjmp.h>、<signal.h>、<stdarg.h>

FILE

源码面前,了无秘密;

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

_iobuf结构体在 C 的标准库中是一个重要结构体,我们再来看其在标准输入输出的实现中扮演的作用:

FILE * __iob_func(void):
                    // __iob_func()是返回FILE* 指针的指针函数;
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])

stdin、stdout、stderr,本质上都是 FILE* 类型。也即凡是参数要求为 FILE* 类型的地方,都可将 stdin、stdout、stderr 传递进去。

printf("%s\n", typeid(stdout).name());
                    // struct _iobuf *
printf("%s\n", typeid(FILE*).name());
                    // struct _iobuf *

fputs

位于#include <stdio.h>

f表示 file(FILE*,准确地说 ),向文件流中写东西;
功能上接近于 C++ 流中的输出文件流,也即 <fstream> 文件,标准命名空间中的std::ofstream

int fput(const char*, FILE* );
FILE* fp = fopen("./1.txt", "w+");
fputs("hello", fp);
                // 将1.txt文件的内容清空
                // 写入 hello

如上文所描,stdin、stdout、stderr 的本质都是 FILE* 类型,故均可作为fputs的第二个参数。

你可能感兴趣的:(C 标准库(一))