Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::setvbuf

      From cppreference.com
      <cpp‎ |io‎ |c
       
       
       
       
      Defined in header<cstdio>
      int setvbuf(std::FILE* stream,char* buffer,int mode,std::size_t size);

      Changes the buffering mode of the given file streamstream as indicated by the argumentmode. In addition,

      • Ifbuffer is a null pointer, resizes the internal buffer tosize.
      • Ifbuffer is not a null pointer, instructs the stream to use the user-provided buffer of sizesize beginning atbuffer. The stream must be closed (withstd::fclose) before thelifetime of the array pointed to bybuffer ends. The contents of the array after a successful call tostd::setvbuf are indeterminate and any attempt to use it is undefined behavior.

      Contents

      [edit]Parameters

      stream - the file stream to set the buffer to
      buffer - pointer to a buffer for the stream to use or null pointer to change size and mode only
      mode - buffering mode to use. It can be one of the following values:
      _IOFBF full buffering
      _IOLBF line buffering
      _IONBF no buffering
      size - size of the buffer

      [edit]Return value

      0 on success or nonzero on failure.

      [edit]Notes

      This function may only be used afterstream has been associated with an open file, but before any other operation (other than a failed call tostd::setbuf/std::setvbuf).

      Not allsize bytes will necessarily be used for buffering: the actual buffer size is usually rounded down to a multiple of 2, a multiple of page size, etc.

      On many implementations, line buffering is only available for terminal input streams.

      A common error is setting the buffer ofstdin orstdout to an array whose lifetime ends before the program terminates:

      int main(){char buf[BUFSIZ];std::setbuf(stdin, buf);}// lifetime of buf ends, undefined behavior

      The default buffer sizeBUFSIZ is expected to be the most efficient buffer size for file I/O on the implementation, but POSIXfstat often provides a better estimate.

      [edit]Example

      One use case for changing buffer size is when a better size is known.

      Run this code
      #include <cstdio>#include <cstdlib>#include <iostream>#include <sys/stat.h> int main(){std::FILE* fp=std::fopen("/tmp/test.txt","w+");if(!fp){std::perror("fopen");returnEXIT_FAILURE;} struct stat stats;if(fstat(fileno(fp),&stats)==-1)// POSIX only{std::perror("fstat");returnEXIT_FAILURE;} std::cout<<"BUFSIZ is "<<BUFSIZ<<", but optimal block size is "<< stats.st_blksize<<'\n';if(std::setvbuf(fp, nullptr,_IOFBF, stats.st_blksize)!=0){std::perror("setvbuf failed");// POSIX version sets errnoreturnEXIT_FAILURE;} // Read entire file: use truss/strace to observe the read(2) syscalls usedfor(int ch;(ch=std::fgetc(fp))!=EOF;){} std::fclose(fp);returnEXIT_SUCCESS;}

      Possible output:

      BUFSIZ is 8192, but optimal block size is 65536

      [edit]See also

      sets the buffer for a file stream
      (function)[edit]
      [virtual]
      provides user-supplied buffer or turns this filebuf unbuffered
      (virtual protected member function ofstd::basic_filebuf<CharT,Traits>)[edit]
      C documentation forsetvbuf
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/io/c/setvbuf&oldid=158998"

      [8]ページ先頭

      ©2009-2025 Movatter.jp