打印
[其他产品]

C语言 setbuf()函数,控制缓冲模式详解

[复制链接]
3952|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 | 只看该作者
没用过这个函数,这个函数能提高程序运行、

使用特权

评论回复
5
lix1yr| | 2024-6-28 13:26 | 只看该作者
setbuf()函数是C语言标准库中的函数,用于控制文件流的缓冲模式

使用特权

评论回复
6
y1n9an| | 2024-6-28 14:32 | 只看该作者
通过setbuf()函数,可以将自定义的缓冲区与文件流相关联,从而控制文件流的缓冲模式

使用特权

评论回复
7
tax2r6c| | 2024-6-28 15:36 | 只看该作者
一般来说,可以通过setbuf()函数来设置全缓冲、行缓冲或者无缓冲模式

使用特权

评论回复
8
su1yirg| | 2024-6-28 16:41 | 只看该作者
如果setbuf()中的buffer为NULL,那么文件流将变为无缓冲模式

使用特权

评论回复
9
kaif2n9j| | 2024-6-28 17:52 | 只看该作者
正常的话,如果buffer为NULL,那么文件流将变为无缓冲模式

使用特权

评论回复
10
l1uyn9b| | 2024-6-29 06:40 | 只看该作者
如果setbuf()中如果buffer为NULL,那么文件流将变为无缓冲模式

使用特权

评论回复
11
d1ng2x| | 2024-6-29 08:17 | 只看该作者
话说,这种操作一般是用作于哪里?

使用特权

评论回复
12
b5z1giu| | 2024-6-29 09:22 | 只看该作者
我觉得这种控制缓冲区模式挺好的,可以让缓冲更好的利用起来

使用特权

评论回复
13
cen9ce| | 2024-6-29 10:01 | 只看该作者
一般是无缓冲还是全缓冲怎么选择?

使用特权

评论回复
14
t1ngus4| | 2024-6-29 12:11 | 只看该作者
这种模式的话,咋说呢,其实自己写个缓冲操作也是可以的啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2038

主题

7364

帖子

10

粉丝