標準/拡張機能 | 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() はゼロ以外を戻します。
エレメント | データ型 | 機能説明 |
---|---|---|
__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 注: __dsorgPS または __dsorgPO が設定された場合のみ有効。
|
__noseek_to_seek | uint8_t | noseek が seek に変更された理由を識別する。値は以下のとおり。 __AM_BSAM_NOSWITCH 注: __dsorgPS または __dsorgPO が設定された場合のみ有効。
|
__dsname | char * | このフィールドの内容は、以下によって決まる。
char *__dsname フィールドは、ライブラリー関数に よって内部的に割り振られる。このフィールドは、次に fldata() 関数を 呼び出す前に保管されなければならない。 |
__reserve4 | unsigned long | 予約済み。 |
#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);
}