13.8 COBOL入出力サービスルーチンの使用例
COBOL入出力サービスルーチンの使用例を,次に示します。
- (例1)サービスルーチンを使ってファイルを読み込むCプログラム
: #include "CBL85fl.h" /* COBOL提供ヘッダファイルの取り込み */ : CBLCOMFL com ; /* 管理情報インタフェース領域 */ CBLPARMFL parm ; /* パラメタインタフェース領域 */ char filename[100] ; /* ファイル名称 */ int end_flg ; memset(&com, 0x00, sizeof(CBLCOMFL)) ; /* テーブル0クリア */ memset(&parm, 0x00, sizeof(CBLPARMFL)) ; /* OPENパラメタを設定する */ strcpy(filename, "/tmp/outfile") ; com.cblcom_pathname = filename ; com.cblcom_flopt = CBLCOM_NOCHK ; /*属性チェックをしない*/ com.cblcom_openmode = CBLCOM_OPEN_INPUT ; /*OPENモードはINPUT*/ parm.cblparm_lock = CBLPARM_NOLOCK ; /*施錠なし*/ if (CBLOPEN(&com, &parm) != 0) { /*CBLOPENサービスルーチン実行*/ ERROUT(&com) ; /*エラー情報出力用サブルーチン呼び出し*/ return(-1) ; } if (memcmp(com.cblcom_form, "SAMV", 4) != 0) { printf("ファイルはCOBOL順可変長形式ではない。\n") ; return(-1) ; } /* READパラメタを設定する */ parm.cblparm_lock = CBLPARM_NOLOCK ; /*施錠なし*/ /* OPENのリターン情報に従い入出力バッファ取得 */ if ((parm.cblparm_read_buf = malloc(com.cblcom_maxrec)) == NULL) { : /* 必要なメモリが取得できない場合のエラー処理 */ } end_flg = 0 ; while(end_flg == 0) { /*レコード終了までループ*/ if (CBLREAD(&com , &parm) == 0) { /*CBLREADサービスルーチン実行*/ : /* READ成功時の処理 */ } else { end_flg = 1 ; /*読み込み終了フラグ オン */ if (com.cblcom_fs == 10) { /*入出力状態値10:ファイル終了*/ : /* ファイル終了時の処理 */ } else { ERROUT(&com) ; /*エラー処理*/ } } } /* 終了処理 */ if (CBLCLOSE(&com, &parm) != 0) { /*CBLCLOSEサービスルーチン実行*/ ERROUT(&com) ; }
- (例2)エラー情報を出力するC副プログラム
extern void ERROUT(p1) CBLCOMFL *p1 ; { if ((p1->cblcom_msgno >= 3701) && (p1->cblcom_msgno <= 3703)) { printf("パラメタエラー(詳細情報番号=%d)\n", p1->cblcom_cbldetail) ; } else { printf("メッセージ番号=%d\n",p1->cblcom_msgno) ; if (p1->cblcom_sysinf == CBLCOM_ERR_SYSTEM) { /* システムエラー情報がある時 */ printf("システムコール番号=%dエラーコード=%d\n", p1->cblcom_funcno, p1->cblcom_errno) ; } } }