標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Language Environment | 両方 | なし |
#include <stdio.h>
#include <stdio_ext.h>
void _flushlbf(void);
#define _OPEN_SYS_UNLOCKEKD 1
#include <stdio.h>
#include <stdio_ext.h>
void _flushlbf_unlocked(void);
_flushlbf() 関数は、行バッファリングされたすべてのオープン・ストリームをフラッシュします。
_flushlbf() 関数は、ungetc() 関数と ungetwc() 関数の影響を受けます。この関数を呼び出すと、_flushlbf() は、文字がプッシュ・バックされるときのファイル位置をバックアップするようになります。詳しくは、ungetc() - 入力ストリームへの文字のプッシュおよび ungetwc() - ストリームへのワイド文字のプッシュを参照してください。必要に応じて _EDC_COMPAT 環境変数をオープン時に設定することができ、それにより、_flushlbf() は、プッシュ・バックされたすべての文字を廃棄し、ファイル位置を、ungetc() または ungetwc() 関数呼び出しがはじめて発行 されたときの位置のままにします。
ungetwc() 関数が 1 つのワイド文字をテキスト・ストリームにプッシュした後で _flushlbf() 関数が使用されると、ungetwc() 関数が発行されたときのファイルの位置から 1 ワイド文字分だけ位置がバックアップされます。ワイド指向バイナリー・ストリームの場合は、ungetc バッファーでワイド文字を表すのに使用されるバイト数にもとづいて、位置がバックアップされます。このため、最初の位置でまったく読み取られなかったワイド指向バイナリー ・ストリームが宛先であるとき、文字に対して ungetwc() を使用 しようとすると、_flushlbf() に対して未定義の動作の結果となります。_EDC_COMPAT 環境変数でも ungetwc() の後の _flushlbf() の動作が変更 されること、およびこの変数により、プッシュ・バックされたすべての ワイド char が廃棄され、位置は、ungetwc() が発行された位置のままになる ことに注目してください。_EDC_COMPAT 環境変数の詳細については、「z/OS XL C/C++ プログラミング・ガイド」の『環境変数』を参照してください。
_flushlbf() が失敗した場合、位置は、ungetc() または ungetwc() 関数 呼び出しが最初に発行されたときのファイル内の位置のままになります。すべての押し返された文字は廃棄されます。
バッファリング・モードとファイル・タイプは、出力データがフラッシュされるときに影響を与えます。 詳しくは、「z/OS XL C/C++ プログラミング・ガイド」の『C ストリームのバッファー方式』を参照してください。
すべてのストリームは、_flushlbf() 呼び出し後もオープンのまままま残ります。読み取り操作は、書き込み操作の直後または直前には不可能である ので、_flushlbf() 関数を使用して、これら 2 つのモード間の切り替えを行う ことができます。_flushlbf() 関数は、読み取りプログラムや、同時書き込みまたは更新プログラムで動作するときにバッファーを最新表示するためにも使用できます。
_flushlbf_unlocked() 関数は、スレッド・セーフでないことを除いて、_flushlbf() 関数と等価です。この関数は、ユーザーが、行バッファリングされたすべてのオープン・ファイルをロックしているかどうかにかかわらず、マルチスレッド・アプリケーション内で安全に使用できます。
行バッファリングされたすべてのオープン・ファイルをフラッシュ中に、あるファイルのフラッシュに失敗すると、そのファイルは未変更のまま残ります。しかしフラッシュは、正常にフラッシュできる、行バッファリングされたその他のオープン・ファイルで継続されます。
_flushlbf() 関数は、値を戻しません。
/* CELEBF84
この例では、行バッファリングされたすべてのファイルをフラッシュします。
*/
#include <stdio.h>
#include <stdio_ext.h>
#include <string.h>
#define BUF_SIZE 128
int main(void)
{
char lbuf[BUF_SIZE]; /* line buffer */
char fbuf[BUF_SIZE]; /* full buffer */
char *tagstr = "This file was modified!";
FILE *lfp;
FILE *ffp;
lfp = fopen("newlfile.dat", "a+");
if(lfp == NULL){
perror("Open file failed!¥n");
return -1;
}
if(setvbuf(lfp, lbuf, _IOLBF, sizeof(lbuf)) != 0){ /* set lbuf to line-buffered */
perror("Format line-buffered failed!¥n");
fclose(lfp);
return -1;
}
if (__flbf(lfp)) printf("newlfile.dat is line-buffered¥n");
else printf("newlfile.dat is not line-buffered¥n");
if(fwrite(lfp,strlen(tagstr), 1, lfp) != 1){ /* write tag string to line buffer*/
perror("Write line buffer failed!¥n");
fclose(lfp);
return -1;
}
printf("Write to the line buffered file succeeded¥n");
ffp = fopen("newffile.dat", "a+");
if(ffp == NULL){
perror("Open file failed!¥n");
fclose(lfp);
return -1;
}
if(setvbuf(ffp, fbuf, _IOFBF, sizeof(fbuf)) != 0){ /* set fbuf to full-buffered */
perror("Format full-buffered failed!¥n");
fclose(ffp);
return -1;
}
if (__flbf(ffp)) printf("newffile.dat is line-buffered¥n");
else printf("newffile.dat is not line-buffered¥n");
if(fwrite(tagstr, strlen(tagstr), 1, ffp) != 1){ /* write tag string to full buffer */
perror("Write full buffer failed!¥n");
fclose(lfp);
fclose(ffp);
return -1;
}
printf("Write to the full buffered file succeeded¥n");
_flushlbf(); /* flush line buffered files */
printf("Only line buffered files are flushed...¥n");
fclose(lfp);
fclose(ffp);
return 0;
}
newlfile.dat is line-buffered
Write to the line buffered file succeeded
newffile.dat is not line-buffered
Write to the full buffered file succeeded
Only line buffered files are flushed...