-2

该函数setvbuf()可用于使流无缓冲:

#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  • 当作为 传递时,size参数的值是什么意思?mode_IONBF

  • 缓冲区会被分配吗?

  • 可以通过0吗?

4

1 回答 1

0

C标准的当前版本(C11)说:

7.21.5.6setvbuf功能

概要

   #include <stdio.h>
   int setvbuf(FILE * restrict stream,
               char * restrict buf,
               int mode, size_t size);

描述

setvbuf函数只能在 指向的流stream与打开的文件关联之后并且在对流执行任何其他操作(对 的不成功调用setvbuf除外)之前使用。该参数mode确定如何缓冲流,如下所示:_IOFBF使输入/输出完全缓冲;_IOLBF导致输入/输出被行缓冲;_IONBF导致输入/输出无缓冲。如果buf不是空指针,则可以使用它指向的数组而不是setvbuf函数分配的缓冲区273 ) 并且参数size指定数组的大小;否则,size可以确定由setvbuf功能。数组的内容在任何时候都是不确定的。

退货

setvbuf函数在成功时返回零,如果给定的值无效mode或无法满足请求,则返回非零。

条件时态的使用为库作者提供了很大的灵活性来实现setvbuf().

史蒂夫·萨米特这样论证:

如果作为 传递,显然size应该忽略,并且显然是要传递的适当值。(也就是说,如果您传递了 0 以外的任何数字,它仍然会被忽略,并且不会分配任何内容,但是该调用看起来会非常具有误导性。)但是我刚刚看过的两个不同的手册页没有出来并明确地说出来。mode_IONBF0

C 标准确实允许在size所有情况下都被忽略,并且对于无缓冲情况下忽略它是有道理的。

我找到了一个也有意义的替代方案:setvbuf()仍​​然可以指定流输出函数使用的缓冲区,静态的或分配的,只要流函数在返回时不保留任何未刷新的输出。例如,printf可以使用此缓冲区来组合其输出并按块刷新它。C 标准没有指定无缓冲流对写入输出流的系统句柄的每个字节使用系统调用。这些是超出标准范围的实施细节。

如果setvbuf()确实尝试分配size字节并失败,它可能会返回一个非零值并且不会使流无缓冲。仍然符合要求的意外行为。尝试setvbuf(stdout, NULL, _IOFBF, SIZE_MAX);

于 2018-03-24T11:24:38.263 回答