[其他产品] C语言 setbuf()函数,控制缓冲模式详解

[复制链接]
4544|13
 楼主| 两只袜子 发表于 2024-5-24 15:53 | 显示全部楼层 |阅读模式
setbuf()函数
C语言中,setbuf()是标准库stdio.h中的函数,主要作用是用于设置C语言读写过程中流stream的缓冲模式,比如是全缓冲模式、行缓冲模式及无缓冲的模式。而什么是缓冲模式呢?

C语言的读写操作,在有缓冲的模式下,会先将数据批量读取到缓冲区中,然后根据特定的缓冲模式再进行相关的读写操作。

其中全缓冲模式,且没有调用ffrush()的情况下,一般会在缓冲区满了之后,才会继续进行相关的读写操作(比如写入磁盘或输出到屏幕),如果是调用了ffrush()函数,则会立马继续进行相关读写操作。

在行缓冲模式下,则会在遇到换行符的时候进行相关的读写操作,这一般是一种逐行读写的模式。

无缓冲,则数据不会被写入到缓冲区,而是直接与磁盘或终端之间进行读写的操作。

一般情况下,setbuf()设置的缓冲模式会根据参数的不同而设置成全缓冲或无缓冲的模式。

setbuf()函数语法:
void setbuf(FILE *fp, char *buf);
setbuf()参数
参数        描述
fp        FILE类型指针,一般表示文件流
buf        char类型指针(数组),指向缓冲区的指针
setbuf()函数控制的缓冲模式
模式        描述
全缓冲        buf指针指向的缓冲区空间大小如果指定大小的话,最小值应该为BUFSIZ,这是C语言中预定的宏,用来表示字符数组的长度。
无缓冲        buf指针为NULL(这也是一个预定义的宏),则无缓冲模式
setbuf()函数使用方法
因为setbuf()函数是用于设定读写缓冲的模式,所以,其应该在C语言读写操作文件打开且未进行读写操作的时候调用。

setbuf()返回值
无,为void。

setbuf()实例代码
(不好意思,这段话作废,与下面代码无关)如下实例代码,使用fopen()函数创建一个用于读取文件的文件流,并使用fgetc()函数读取一个字符,然后使用ftell()函数获取当前的指针位置,之后使用rewind()函数重置文件指针位置为起始位置,之后再使用ftell()函数获取当前的指针位置,然后将这两个位置进行比较:

#include "stdio.h"

int main() {
    FILE *fp = fopen("D:\\text.txt", "w");
    if(fp == NULL){
        printf("文件打开失败\n");
    }else{
        // 在打开文件后,在写入之前,设置缓冲区模式
        char buf[BUFSIZ]; //使用设置字符数组(缓冲区)大小为BUFSIZ个字节
        setbuf(fp, buf);
        char str[] = "微信公众号:全栈开发助手";
        // 写入内容
        fputs(str, fp);
        fflush(fp);
        fclose(fp);
        fp = NULL;
    }
   
    return 0;

}
如上代码,编译运行后,可以在fopen()函数中指定的文件路径,找到该文件,然后打开,可以看到文件中的内容为:微信公众号:全栈开发助手。

免责声明:内容仅供参考,不保证正确性。
huahuagg 发表于 2024-5-24 23:17 | 显示全部楼层
这个函数还第一次看到,不知道使用了,能否让程序更加好用。
看别人照片 发表于 2024-5-27 09:32 | 显示全部楼层
我先试试函数
幸福小强 发表于 2024-6-26 22:31 | 显示全部楼层
没用过这个函数,这个函数能提高程序运行、
lix1yr 发表于 2024-6-28 13:26 | 显示全部楼层
setbuf()函数是C语言标准库中的函数,用于控制文件流的缓冲模式
y1n9an 发表于 2024-6-28 14:32 | 显示全部楼层
通过setbuf()函数,可以将自定义的缓冲区与文件流相关联,从而控制文件流的缓冲模式
tax2r6c 发表于 2024-6-28 15:36 | 显示全部楼层
一般来说,可以通过setbuf()函数来设置全缓冲、行缓冲或者无缓冲模式
su1yirg 发表于 2024-6-28 16:41 | 显示全部楼层
如果setbuf()中的buffer为NULL,那么文件流将变为无缓冲模式
kaif2n9j 发表于 2024-6-28 17:52 | 显示全部楼层
正常的话,如果buffer为NULL,那么文件流将变为无缓冲模式
l1uyn9b 发表于 2024-6-29 06:40 | 显示全部楼层
如果setbuf()中如果buffer为NULL,那么文件流将变为无缓冲模式
d1ng2x 发表于 2024-6-29 08:17 | 显示全部楼层
话说,这种操作一般是用作于哪里?
b5z1giu 发表于 2024-6-29 09:22 | 显示全部楼层
我觉得这种控制缓冲区模式挺好的,可以让缓冲更好的利用起来
cen9ce 发表于 2024-6-29 10:01 | 显示全部楼层
一般是无缓冲还是全缓冲怎么选择?
t1ngus4 发表于 2024-6-29 12:11 | 显示全部楼层
这种模式的话,咋说呢,其实自己写个缓冲操作也是可以的啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8121

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部