深圳优化网站公司,包装策划与设计专业,seo优化一般包括,宝山宜昌网站建设标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理#xff0c;从而避免了应用程序需要考虑这一点所带来的麻烦。 标准I/O提供了三种类型的缓冲#xff1a; #xff08;1#xff09;全缓冲。这种情况下#xff0c;在填满标…标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理从而避免了应用程序需要考虑这一点所带来的麻烦。 标准I/O提供了三种类型的缓冲 1全缓冲。这种情况下在填满标准I/O缓冲区后才进行实际的I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时相关标准I/O函数通常调用malloc获得需使用的缓冲区。 术语冲洗flush说明标准I/O缓冲区的写操作。缓冲区可由标准I/O例程自动冲洗例如当填满一个缓冲区时或者可以调用函数fflush冲洗一个流。值得引起注意的是在UNIX环境中flush有两种意思在标准I/O库方面flush冲洗意味着将缓冲区中的内容写到磁盘上该缓冲区可能只是局部填写的。在终端驱动程序方面flush刷清表示丢弃已存储在缓冲区中的数据。 2行缓冲。在这种情况下当在输入和输出中遇到换行符时标准I/O库执行I/O操作。这允许我们一次输出一个字符用标准I/O fputc函数该函数一次只输出一个字符没有换行符但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时例如标准输入和标准输出通常使用行缓冲。 对于行缓冲有两个限制。第一因为标准I/O库用来收集每一行的缓冲区的长度是固定的所以只要填满了缓冲区那么即使还没有写一个换行符也进行I/O操作。第二任何时候只要通过标准I/O库要求从a一个不带缓冲的流或者b一个行缓冲的流它要求从内核得到数据得到输入数据那么就会造成冲洗所有行缓冲输出流。在b中带了一个括号中的说明其理由是所需的数据可能已在该缓冲区中它并不要求在需要数据时才从内核读数据。很明显从不带缓冲的一个流中进行输入a项要求当时从内核得到数据。 3不带缓冲。标准I/O库不对字符进行缓冲存储。例如如果用标准I/O函数fputs写15个字符到不带缓冲的流中则该函数很可能用write系统调用函数将这些字符立即写到相关联的打开文件上。 标准出错流stderr通常是不带缓冲的这就使得出错信息可以尽快显示出来而不管它们是否含有一个换行符。 ISO C要求下列缓冲特征 当且仅当标准输入和标准输出并不涉及交互式设备时它们才是全缓冲的。标准出错绝不会是全缓冲的。但是这并没有告诉我们如果标准输入和输出涉及交互式设备时它们是不带缓冲的还是行缓冲的以及标准出错是不带缓冲的还是行缓冲的。很多系统默认使用下列类型的缓冲 标准出错是不带缓冲的。如若是涉及终端设备的其他流则它们是行缓冲的否则是全缓冲的。对任何一个给定的流如果我们并不喜欢这些系统默认的情况则可调用下列两个函数中的一个更改缓冲类型 #include stdio.h
void setbuf( FILE *restrict fp, char *restrict buf );
int setvbuf( FILE *restrict fp, char *restrict buf, int mode, size_t size );
返回值若成功则返回0若出错则返回非0值 这些函数一定要在流已被打开后调用而且也应该在对该流执行任何一个其他操作之前调用。 可以使用setbuf函数打开或关闭缓冲机制。为了带缓冲进行I/O参数buf必须指向一个长度为BUFSIZE的缓冲区该常量定义在stdio.h中。通常在此之后该流就是全缓冲的但是如果流与一个终端相关那么某些系统也可将其设置为行缓冲。为了关闭缓冲将buf设置为NULL。 使用setvbuf我们可以精确地指定所需的缓冲类型。这是用mode参数实现的 _IOFBF全缓冲_IOLBF行缓冲_IONBF不带缓冲 如果指定一个不带缓冲的流则忽略buf和size参数。如果指定全缓冲或行缓冲则buf和size可选择地指定一个缓冲区及其长度。如果该流是带缓冲的而buf是NULL则标准I/O库将自动地为该流分配适当长度的缓冲区。适当长度指的是由常量BUFSIZE所指定的值。 某些C函数库实现使用stat结构中的成员st_blksize所指定的值决定最佳I/O缓冲区长度。GNU C函数库就使用这种方法。 表5-1列出了这两个函数的动作以及它们的各个选项。 要了解如果在一个函数内分配一个自动变量类的标准I/O缓冲区则从该函数返回之前必须关闭该流。另外有些实现将缓冲区的一部分用于存放它自己的管理操作信息所以可以存放在缓冲区中的实际数据字节数少于size。一般而言应由系统选择缓冲区的长度并自动分配缓冲区。在这种情况下关闭此流时标准I/O库将自动释放缓冲区。 任何时候我们都可以强制冲洗一个流。 #include stdio.h
int fflush( FILE *fp );
返回值若成功则返回0若出错则返回EOF 此函数使该流所有未写的数据都被传送至内核。作为一个特例如若fp是NULL则此函数将导致所有输出流被冲洗。 本篇博文内容摘自《UNIX环境高级编程》第二版仅作个人学习记录所用。关于本书可参考http://www.apuebook.com/。 转载于:https://www.cnblogs.com/nufangrensheng/p/3505307.html