fldata() - ファイル情報の検索

標準

標準/拡張機能 C/C++ 依存項目
Language Environment 両方  

形式

#include <stdio.h>

int fldata(FILE *file, char *filename, fldata_t *info);

#define _OPEN_SYS_UNLOCKED_EXT 1
#include <stdio.h>

int fldata_unlocked(FILE *file, char *filename, fldata_t *info);

機能説明

file によって指定されるオープン・ストリームについての 情報を得ます。ファイル名を filename に、その他の情報を構造体 info に戻します。filename に戻されるファイル名は、fopen() また は freopen() で指定された名前です。ファイルが ddname (例えば、fopen("DD:A","w")) でオープンされると、filename フィールドには、ファイルをオープンするのに使用される ddname が、dd: という接頭部付きで入ります。ファイルが DASD データ・セットまたはメモリー・ファイルである場合は、フ ィールド __dsname には dsname が入ります。ファイルが HFS ファイルの場合は、フィールド __dsname には、パス名が入ります。その他のファイルでは、NULL になります。

障害がある場合は、情報構造体の内容は不明確です。

ユーザーのネーム・スペースが侵害されるのを回避するため、この非標準関数には 2 つの名前があります。1 つの名前の接頭部には 2 つの下線文字が付き、もう 1 つの名前の接頭部には付きません。接頭部下線文字が付いていない名前は、LANGLVL(EXTENDED) を使用する場合にのみ表示されます。

この関数を使用するには、その外部エントリー・ポイント名 (2 つの下線文字で始まる名前) を使用して呼び出すか、LANGLVL(EXTENDED) を使用してコンパイルする必要があります。LANGLVL(EXTENDED) を使用すると、ヘッダー内の関連情報も表示されます。

filename に関する考慮事項について詳しくは、「z/OS XL C/C++ プログラミング・ガイド」の『ファイルのオープン』の該当するトピックを参照してください。

fldata で標準ストリームがはじめて参照 される場合、fldata() 関数を呼び出すと、このストリームがオープンされます。

表 1 を参照してください。

注:

NULL のファイル名は、ファイル名が戻されないことを 示しています。

FILENAME_MAX をファイル名バッファーのサイズとして推奨します。

この後の表 "fldata_t データ構造に戻されるエレメント"では、fldata_t データ構造のフィールドについて説明しています。詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。

fldata_unlocked() は、スレッド・セーフでないことを除いて、機能的に fldata() と 等価です。この関数をマルチスレッドのアプリケーション内で安全に使用できるのは、 flockfile() 関数または ftrylockfile() 関数のどちらかへの呼び出しが成功した後のように、 呼び出しスレッドが (FILE*) オブジェクトを所有している間に、この関数を呼び出す場合だけです。

POSIX C の特殊な動作: z/OS®UNIX サービスの下では、fldata() を呼び出すアプリケーションに対する exec が以前にあった場合、その exec の実行時に標準ストリームはオープンされています。 従って、fldata() はそれらをもう一度オープンしようとはしません。

戻り値

正常に実行された場合、fldata() は 0 を戻します。

正常に実行されなかった場合は、fldata() はゼロ以外を戻します。

表 1. fldata_t データ構造に戻されるエレメント
エレメント データ型 機能説明
__recfmF:1 unsigned int 固定長レコードを持つかどうかを示す。
__recfmV:1 unsigned int 可変長レコードを持つかどうかを示す。
__recfmU:1 unsigned int 未定義長レコードを持つかどうかを示す。
__recfmS:1 unsigned int 標準レコード (固定長の場合) またはスパン・レコード (可変長の場合) を持つかどうかを示す。
__recfmBlk:1 unsigned int ブロック化レコードを持つかどうかを示す。
__recfmASA:1 unsigned int ASA 印刷制御文字を持つかどうかを示す。
__recfmM:1 unsigned int マシン印刷制御コードを持つかどうかを示す。
__dsorgPO:1 unsigned int 区分データ・セットを持つかどうかを示す。
__dsorgPDSmem:1 unsigned int ファイルがメンバーであるかどうかを示す。
__dsorgPDSdir:1 unsigned int ファイルが PDS または PDSE ディレクトリーであるかどうかを示す。
__dsorgPS:1 unsigned int 順次データ・セットであるかどうかを示す。
__dsorgConcat:1 unsigned int 順次連結ファイルであるかどうかを示す。
__dsorgMem:1 unsigned int メモリー・ファイルであるかどうかを示す。
__dsorgHiper:1 unsigned int ハイパースペース内のメモリー・ファイルであるかどうかを示す。
__dsorgTemp:1 unsigned int tmpfile() で作成された一時ファイルであるかどうかを示す。
__dsorgVSAM:1 unsigned int VSAM ファイルであるかどうかを示す。
__dsorgHFS: unsigned int HFS ファイルであるかどうかを示す。
__openmode:2 unsigned int 値は __TEXT、__BINARY、__RECORD、__BLOCKED である。
__modeflag:4 unsigned int 値は __APPEND、__READ、__UPDATE、__WRITE である。これらのマクロを一緒に追加して値を判別できる。例えば、モード a+ でオープンされたファイルの値 は、__APPEND + __UPDATE となる。
__dsorgPDSE:1 unsigned int ファイルが PDSE であるかどうかを示す。
__vsamRLS:3 unsigned int 戻り値は、__NORLS、__RLS、__TVS である。
__recfmB:1 unsigned int ブロック化レコードが割り振られているかどうかを示す。
__reserve2:3 unsigned int 予約済みビット。
__device char 戻り値は、 __DISK、 __TERMINAL、 __PRINTER、 __TAPE、 __TDQ、 __DUMMY、 __OTHER、 __MEMORY、 __MSGFILE、 __HFS、 __HIPERSPACE __MSGRTN である。
__blksize unsigned long ブロック内のすべての必要な制御情報を含む、ファイルの合計ブロック・サイズ。
__maxreclen unsigned long もしあれば、ASA 制御文字を含む、レコード内の最大データ長。
__vsamtype 符号なし short 戻り値は、__NOTVSAM、__ESDS、__KSDS、 __RRDS、__ESDS_PATH、__KSDS_PATH である。
注: __dsorgVSAM が設定された場合のみ有効。
__vsamkeylen unsigned long (もしあれば) VSAM キーの長さ。
注: __dsorgVSAM が設定された場合のみ有効。
__vsamRKP unsigned long キー位置。
注: __dsorgVSAM が設定された場合のみ有効。
__access_method uint8_t データ・セットに対するアクセス方式を識別する。 値は以下のとおり。

__AM_UNSPEC
__AM_BSAM
__AM_QSAM

注: __dsorgPS または __dsorgPO が設定された場合のみ有効。
__noseek_to_seek uint8_t noseek が seek に変更された理由を識別する。値は以下のとおり。

__AM_BSAM_NOSWITCH
__AM_BSAM_UPDATE
__AM_BSAM_BSAMWRITE
__AM_BSAM_FBS_APPEND
__AM_BSAM_LRECLX
__AM_BSAM_PARTITIONED_DIRECTORY
__AM_BSAM_PARTITIONED_INDIRECT

注: __dsorgPS または __dsorgPO が設定された場合のみ有効。
__dsname char * このフィールドの内容は、以下によって決まる。
  • ファイルが DASD データ・セット、メモリー・ファイル、または HFS ファ イルである場合、__dsname には、ddname でオープンされたファイルの実際 のファイル名が入る。
  • ddname でオープンし、ddname が PDS または PDSE データ・セットの連結 である場合、__dsname には、最初の PDS または PDSE データ・セット名が 入る。これは、最初の PDS または PDSE のディレクトリーをオープンしているからである。
  • ddname(member) でオープンし、ddname が PDS または PDSE データ・セットの連結である場合、__dsname には、メンバーを含む最初の PDS または PDSE のデータ・セット 名が入る。
上記以外の場合は、このフィールドは NULL である。

char *__dsname フィールドは、ライブラリー関数に よって内部的に割り振られる。このフィールドは、次に fldata() 関数を 呼び出す前に保管されなければならない。

__reserve4 unsigned long 予約済み。
注: マクロ名の数値は、stdio.h にあります。__noseek_to_seek の値の意味は、「z/OS XL C/C++ プログラミング・ガイド」の __amrc 構造体の使用に関するトピックで説明しています。

#include <stdio.h>

int main(void)
{
    FILE *stream;
    char filename[100];
    fldata_t fileinfo;
    int rc;

    stream = fopen("myfile.dat","rb+");
⋮
    rc = fldata(stream, filename, &fileinfo);
    if (rc != 0)
       printf("fldata failed¥n");
    else
       printf("filename is %s¥n",filename);
}

関連情報