C 库 - setvbuf() 函数



C 库的 setvbuf() 函数用于控制文件流的缓冲。此函数可以设置缓冲模式,并可选地为流指定缓冲区。

语法

以下是 C 库 setvbuf() 函数的语法:

int setvbuf(FILE *stream, char *buffer, int mode, size_t size);

参数

此函数接受以下参数:

  • stream: 指向 FILE 对象的指针,用于标识打开的文件流。
  • buffer: 指向将用作缓冲区的字符数组的指针。如果 buffer 为 NULL,则函数将自动分配缓冲区。
  • mode: 指定缓冲模式的整数。它可以是以下之一:
    • _IOFBF: 全缓冲。当缓冲区满时写入数据。
    • _IOLBF: 行缓冲。当遇到换行符时写入数据。
    • _IONBF: 无缓冲。立即写入数据。
  • size: 缓冲区的大小(以字节为单位)。如果 buffer 为 NULL,则忽略此参数。

返回值

函数成功返回 0,失败返回非零值。

示例 1:使用自定义缓冲区的全缓冲

在这里,我们为全缓冲设置了一个大小为 1024 字节的自定义缓冲区。当缓冲区满或文件关闭时,数据将写入文件。

以下是 C 库 setvbuf() 函数的示例。

#include <stdio.h>

int main() {
   FILE *file = fopen("example1.txt", "w");
   if (!file) {
       perror("Failed to open file");
       return 1;
   }

   char buffer[1024];
   if (setvbuf(file, buffer, _IOFBF, sizeof(buffer)) != 0) {
       perror("Failed to set buffer");
       return 1;
   }

   fputs("This is a test string.", file);
   fclose(file);
   return 0;
}

输出

以上代码在文件关闭时将“This is a test string.”写入 example1.txt。

This is a test string.

示例 2:无缓冲

此示例禁用缓冲,这意味着数据将立即写入文件。

#include <stdio.h>

int main() {
   FILE *file = fopen("example3.txt", "w");
   if (!file) {
       perror("Failed to open file");
       return 1;
   }

   if (setvbuf(file, NULL, _IONBF, 0) != 0) {
       perror("Failed to set buffer");
       return 1;
   }

   fputs("This is a test string.", file);
   fputs("This is another string.", file);
   fclose(file);
   return 0;
}

输出

执行以上代码后,它会立即将“This is a test string.This is another string.”写入 example3.txt,因为每次 fputs 调用都会进行写入。

This is a test string.This is another string.
广告