元のリンク: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
3
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
3
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
3
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函数关闭这两个文件。