第5章  ILE-RPG で統合ファイルシステムの利用例
RPGプログラマーの為のC言語講座

ILE−RPGから統合ファイルシステムを利用してみましょう!

残念ながら、RPGでは統合ファイルシステム(IFS)にアクセスできません。

ここでは、CのモジュールをILE−RPGにバインドして統合ファイルシステムを利用します。

Cのモジュール
IFS1C(IFSREADとIFSWRITEを実装)


/*---------------------------------------------------------------*/
/* PROGRAM-ID  : IFS1C                                           */
/* REMARKS     : IFSファイルI/O                          */
/* AUTHOR      : Y.Ide                                           */
/* DATE-WRITEN : 1999/9/24                                       */
/* VERSION     : 01.00 ORIGINAL                                  */
/*---------------------------------------------------------------*/
/* IFS(統合ファイルシステム)のストリームファイルを          */
/* バイナリーモードでオープンします。                            */
/*  CRTCMOD SYSIFCOPT(IFSIO)でコンパイルしてください             */

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int  IFSREAD(char *filename, char *buf, int *buflen) {
  FILE *fp1;
  char bin[32768] = {0};
  int  rc = 0;
  char *ptr;
  int  blank = ' ';

/* NULLターミネイト*/
  ptr = strchr(filename,blank);
  if (ptr != NULL) *ptr = 0;
/*読み込み専用でファイルオープン*/
  fp1 = fopen(filename,"rb");
  if (fp1 == NULL){
     perror(filename);
     rc = -1;
  }
  fgets(bin, (*buflen)+1, fp1);
  fclose(fp1);

  memcpy(buf,bin,*buflen);
  return rc;
 }

int  IFSWRITE(char *filename, char *buf, int *buflen) {
  FILE *fp1;
  char bin[32768] = {0};
  int  rc = 0;
  char *ptr;
  int  blank = ' ';

/* NULLターミネイト*/
  ptr = strchr(filename,blank);
  if (ptr != NULL) *ptr = 0;
  memcpy(bin,buf,*buflen);

/*追記でファイルオープン*/
  fp1 = fopen(filename,"ab");
  if (fp1 == NULL){
     perror(filename);
     rc = -1;
  }
  fputs(bin,fp1);
  fclose(fp1);

  return rc;

 }

ILE-RPGのモジュール IFS1R(メインプログラム)

     H DATEDIT(*YMD/)
     H*---------------------------------------------------------------*
     H* PROGRAM-ID    :    IFC1R                                      *
     H* REMARKS       :   IFSREADを呼び出すPGM                   *
     H* AUTHOR        :    Y.IDE                                      *
     H* DATE-WRITEN   :    1999/9/24                                  *
     H* VERSION       :    01.00 ORIGINAL                             *
     H*---------------------------------------------------------------*
     H* IFS1C モジュールをバイントしてください。
     H*---------------------------------------------------------------*
     DIFSWRITE         PR            10I 0 EXTPROC('IFSWRITE')
     D                             1024
     D                            32767
     D                               10I 0
     D*
     DIFSREAD          PR            10I 0 EXTPROC('IFSREAD')
     D                             1024
     D                            32767
     D                               10I 0
     D BUFDS           DS
     D BUF                        32767    INZ(' ')
     D BUFA                           1    OVERLAY(BUF) DIM(32767)
     D*
     D FILEN           S           1024    INZ(' ')
     D BUFLEN          S             10I 0
     D RC              S             10I 0 INZ(0)
     C*
     C                   MOVE      *LOVAL        FILEN
     C                   EVAL      FILEN = '/HOME/FILE.EBC'
     C*
     C                   Z-ADD     12            BUFLEN
     C                   MOVEL     'テストです'BUF
     C                   EVAL      RC = IFSWRITE(FILEN : BUF : BUFLEN)
     C*
     C                   Z-ADD     12            BUFLEN
     C                   MOVEL     'その2です'BUF
     C                   EVAL      RC = IFSWRITE(FILEN : BUF : BUFLEN)
     C*
     C                   MOVE      *BLANK        BUF
     C*
     C                   Z-ADD     24            BUFLEN
     C                   EVAL      RC = IFSREAD(FILEN : BUF : BUFLEN)
     C*
     C                   MOVEL     BUF           FLD52            52
     C*
     C     FLD52         DSPLY
     C                   SETON                                        LR
     C                   RETURN
     C*

作成方法は、

  • CRTRPGMOD MODULE(CLAB/IFS1R) SRCFILE(CLAB/QRPGLESRC)
  • CRTCMOD MODULE(CLAB/IFS1C) SRCFILE(CLAB/QCSRC) SYSIFCOPT(*IFSIO)
  • CRTPGM PGM(CLAB/IFS1R) MODULE(CLAB/IFS1R CLAB/IFS1C)

WRKLNK OBJ('/HOME/*')

を実行すると、

FILE.EBC

が作成されているはずです。