setvbuf

[機能]

  ストリームのバッファリングとバッファサイズを制御します.成功すると 0 を返します.

[形式]
#include <stdio.h>

int setvbuf(FILE *stream, char *buf, int mode, size_t size)
	stream : FILE 構造体へのポインタ
	buf : バッファ.NULL の時は,自動的に指定したサイズのバッファが割り
	      当てられます.
	mode : バッファリングモード.以下の値から選択します.
		       _IOFBF : 入出力とも完全にバッファリングします
		       _IOLBF : 出力が行単位でバッファリングされます.DOS では,
		                _IOFBF と同じです.
		       _IONBF : 入出力ともバッファが使用されません.
	size : バッファサイズ		
[使用例]

  1. バッファの使用,及び,そのサイズの違いによる影響を示しています
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    long countln(FILE *);
    
    char buf[BUFSIZ*4];   /* File buffer */
    
    int main()
    {
    	long c;
    	time_t start_t, end_t;
    	FILE *stream;
    /*
    		 標準バッファ
    */
    	stream  = fopen("test", "r");
    
    	time(&start_t);
    	c = countln( stream );
    	time(&end_t);
    
    	fclose(stream);
    
    	printf("バッファ使用(Size : %d) Time: %f\n",
              BUFSIZ, difftime(end_t, start_t));
    /*
    		 大きいバッファ
    */
    	stream = fopen("test", "r");
    
    	setvbuf(stream, buf, _IOFBF, sizeof(buf));
    
    	time(&start_t);
    	c = countln( stream );
    	time(&end_t);
    
    	fclose(stream);
    
    	printf("バッファ使用(Size : %d) Time: %f\n",
              BUFSIZ*4, difftime(end_t, start_t));
    /*
    		 バッファ未使用
    */
    	stream = fopen("test", "r");
    
    	setvbuf(stream, NULL, _IONBF, 0);
    
    	time(&start_t);
    	c = countln( stream );
    	time(&end_t);
    
    	fclose(stream);
    
    	printf("バッファ未使用(Size : 0) Time: %f\n", difftime(end_t, start_t));
    
    	return 0;
    }
    
    /****************************************/
    /*     テキストファイルの行数のカウント */
    /*          stream : ストリーム         */
    /*          return : 行数               */
    /****************************************/
    long countln(FILE *stream)
    {
    	long c = 0;
    	char linebuf[256];
    
    	while(!feof(stream)) {
    		if(fgets(linebuf, 255, stream) == NULL)
    			break;
    		++c;
    	}
    
    	return c;
    }
    			
    (出力)
    バッファ使用(Size : 1024) Time: 1.000000
    バッファ使用(Size : 4096) Time: 0.000000
    バッファ未使用(Size : 0) Time: 23.000000			
[参照]

fclosefflush

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引