C言語のsetbuf()関数:バッファーをストリームに関連付ける(ターン)

元のリンク:https://www.jb51.net/article/71720.htm

ヘッダーファイル:

1
#include <stdio.h>

関数setbuf()は、指定されたバッファーを特定のファイルストリームに関連付け、バッファーを操作するときにファイルストリームを直接操作するために使用されます。プロトタイプは次のとおりです。

1
void setbuf ( FILE * stream, char * buf);

[パラメータ] streamはファイルストリームポインタ、bufはバッファの開始アドレスです。


パラメータbufがNULLポインタの場合、バッファリングされません。setbuf()は、setvbuf(stream、buf、buf?_IOFBF:_IONBF、BUFSIZE)を呼び出すのと同じです。

注:ファイルストリームを開いた後、コンテンツを読み取る前に、setbuf()を呼び出してファイルストリームバッファーを設定できます(そうでなければなりません)。

[例]ストリームに関連付けられたバッファの影響を観察します。

1
2
4
5
6
7
8
9
10
11
#include <stdio.h>
char outbuf[BUFSIZ];
int main( void )
{
   setbuf (stdout, outbuf); // 把缓冲区与流相连
   puts ( "This is a test of buffered output.\n" );
   puts (outbuf);
   fflush (stdout); // 刷新
   puts (outbuf); // 输出
   return 0;
}

出力結果:

1
2
4
This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..

プログラムは、最初にoutbufを出力ストリームに接続し、次に文字列を出力します。このとき、バッファはすでにストリームに接続されているため、文字列もoutbufに格納され、次にputs関数が再び出力されるため、outbufは2つ保持します同じ文字列。出力ストリームを更新した後、再度プットし、さらに2つの文字列を出力します。

C言語のsetvbuf()関数:ファイルストリームのバッファ
ヘッダーファイルを設定します

1
#include <stdio.h>

関数setvbuf()は、ファイルストリームのバッファを設定するために使用されます。

1
int setvbuf ( FILE * stream, char * buf, int type, unsigned size);

[パラメータ] streamはファイルストリームポインタ、bufはバッファの最初のアドレス、typeはバッファタイプ、sizeはバッファ内のバイト数です。

パラメータタイプの説明は次のとおりです。

  • _IOFBF(フルバッファー):バッファーが空の場合、ストリームからデータを読み取ります。または、バッファがいっぱいになったときに、データをストリームに書き込みます。
  • _IOLBF(ラインバッファー):データのラインがストリームから読み取られるか、データのラインがストリームに書き込まれるたび。
  • _IONBF(バッファリングなし):ストリームから直接データを読み取るか、バッファなしでストリームに直接データを書き込みます。

[戻り値]成功した場合は0を返し、失敗した場合は0以外を返します。

この関数には、ストリームとバッファの知識が含まれます。C言語のストリームとバッファ(キャッシュ)のトピックを参照してください。

単にバッファを操作するだけの場合は、setbuf()関数を使用することもできます。C言語のsetbuf()関数を参照してください。

setbuf()およびsetvbuf()関数の実際の意味は、ユーザーがファイルを開いた後、fopen()関数によって設定されたデフォルトのバッファーを使用せずに、自分のファイルバッファーを作成できることです。これにより、ユーザーは自分でバッファーを制御できます。これには、バッファーサイズの変更、定期的なバッファーの更新、バッファータイプの変更、ストリームのデフォルトバッファーの削除、およびバッファーなしのストリーム用のバッファーの作成が含まれます。

注:ファイルストリームを開いた後、コンテンツを読み取る前に、setvbuf()を呼び出してファイルストリームバッファーを設定できます(そうでなければなりません)。

【例】ファイルに特別な種類のバッファを設定します。

1
2
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main( void )
{
   FILE *input, *output;
   char bufr[512];
   input = fopen ( "file.in" , "w+" );   /*打开文件*/
   output = fopen ( "file.out" , "w" );
   if ( setvbuf (input, bufr, _IOFBF, 512) != 0) /*失败*/
   {
    printf ( "failed to set up buffer for input file\n" );
   }
   else
   {
    printf ( "buffer set up for input file\n" );
}
   if ( setvbuf (output, NULL, _IOLBF, 132) != 0) /*为流指定特殊的缓冲区*/
   {
    printf ( "failed to set up buffer for output file\n" );
}
   else
   {
    printf ( "buffer set up for output file\n" );
   }
   fclose (input);
   fclose (output);
   return 0;
}

运行结果:

?
1
2
Buffer set up for input file
Buffer set up for output file

程序先打开两个文件,分别设置缓冲区,根据返回值判定是否成功,最后使用fclose函数关闭这两个文件。

おすすめ

転載: www.cnblogs.com/yeshenmeng/p/12756164.html