标准I/O属于库文件,系统调用和库是有区别的,为了方便,标准库中实现了和所有系统调用同名的函数;参考《APUE》
这里部分不解释过多,网上的资料很多,其实熟悉的人基本都知道,我们不可能记住所有的函数的,特别是参数等等,我们能做的就是尽量熟悉他,用到时查一下就能用就行了。
标准I/O函数,摘自于网络:
当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构,它包含了标准I/O库为管理该流所需的所有信息,包括:用于实际I/O的文件描述符、指向用于该缓冲区的指针、缓冲区的长度、当前在缓冲区的字符数以及出错标志等。为引用一个流,需将FILE指针作为参数传递给每个标准I/O函数。
对于标准输入、标准输出和标准出错,他们的文件描述符对应STFIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这三个标准I/O流通过预定义stdin、stdout和stderr加以引用。这三个文件指针以及标准I/O函数都定义在头文件<stdio.h>中。
缓冲
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用次数。提供了三种类型的缓冲:
1) 全缓冲:需在填满标准I/O缓冲区后才进行实际I/O操作。
2) 行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。
3) 不带缓冲:标准I/O库不对字符进行缓冲存储。
一般而言,标准出错是不带缓冲的,打开终端设备的流是行缓冲的,其他所有流则是全缓冲的。当流是全缓冲,但该缓冲区是局部填写时,可用fflush函数冲洗。
可调用下面的函数更改缓冲区类型:
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, intmode, size_t size);
任何时候,我们都可以强制冲洗一个流:
#include <stdio.h>
int fflush(FILE *stream);
此函数将使该流所有未写的数据都被传送至内核。作为一个特例,如若fp是NULL,则此函数将导致所有输出流被冲洗。
打开流
#include <stdio.h>
FILE *fopen(const char *path, const char*mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char*mode, FILE *stream);
这三个函数的区别是: