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

統合ファイルシステムを使ってみよう!

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

ILE−Cで統合ファイルシステムを使用したい場合は、コンパイル時にSYSIFCOPT(IFSIO) を指定してください。指定しなくてもコンパイルは正常に終わりますが、実行時にファイルオープンエラーと なります。

テキストモードでfopenした場合、CCSIDの変換処理が動きます。
そのせいでしょうか、テキストモードで日本語を使おうするとエラーになります。
おそらくトラブルでしょうけど...

<訂正> 1998/9/19
IFSのテキストモードで日本語(MIXED CCSID)が使えないのは、スペックでした。

/*---------------------------------------------------------------*/
/* PROGRAM-ID  : FILE4C                                          */
/* REMARKS     :IFSファイルI/O  
/* AUTHOR      : Y.Ide                                           */
/* DATE-WRITEN : 98/09/10                                        */
/* VERSION     : 01.00 ORIGINAL                                  */
/*---------------------------------------------------------------*/
/* 標準のCでは、ファイルはストリームファイルとして                */
/* 扱われます。*/
/* AS/400のIFS(統合ファイルシステム)を使用すると*/
/* ストリームファイルがサポートされます。*/
/* でも、テキストモードだと日本語はエラーになってしまいます*/
/*  CRTBNDC SYSIFCOPT(IFSIO)でコンパイルすること*/

#include <stdio.h>

int main(void)
{
  FILE *fp1;
  char Txt[15];
  int x;

/*ファイル作成とデータ出力*/ 
  fp1 = fopen("/home/FILE4C.TXT","w codepage=00037");
   printf("%p\n",fp1);
   fprintf(fp1,"CODEPAGE 037\n");
  fclose(fp1);

/*読み込み専用でファイルオープン*/ 
  fp1 = fopen("/home/FILE4C.TXT","r codepage=00037");
   printf("%p\n",fp1);
   fgets(Txt, 15, fp1);
  fclose(fp1);

/*読み込んだデータの表示*/ 
  /*HEX表示*/ 
   printf("Hex = ");
   for (x=0; Txt[x]; x++)
     printf("%.2x", (int)(Txt[x]));
   printf("\n");
  /*テキスト表示*/ 
   printf("Txt = ");
   for (x=0; Txt[x]; x++)
     printf("%c ", Txt[x]);
 }

w codepage=00037を省略すると、JOBのCCSIDが使用されます。 このとき日本のCCSIDをJOBで使用していると(5026,5035)ファイルオープンに失敗してしまいます。

しょうがなく、CODEPAGE037のままでデータに漢字を使ってみました。やはり文字が化けてしまいます。

/*---------------------------------------------------------------*/
/* PROGRAM-ID  : FILE4C1                                          */
/* REMARKS     :IFSファイルI/O  */
/* AUTHOR      : Y.Ide                                           */
/* DATE-WRITEN : 98/09/10                                        */
/* VERSION     : 01.00 ORIGINAL                                  */
/*---------------------------------------------------------------*/
/* 標準のCでは、ファイルはストリームファイルとして*/
/* 扱われます。*/
/* AS/400のIFS(統合ファイルシステム)を使用すると*/
/* ストリームファイルがサポートされます。*/
/* 英語モードだと日本語は化けてしまいます */
/*  CRTBNDC SYSIFCOPT(IFSIO)でコンパイルすること */ 

#include <stdio.h>

int main(void)
{
  FILE *fp1;
  char Bin[15];
  int x;

/*ファイル作成とデータ出力*/
  fp1 = fopen("/home/FILE4C.TXT","w codepage=037");
   printf("%p\n",fp1);
   fprintf(fp1,"漢字データ\n");
  fclose(fp1);

/*読み込み専用でファイルオープン*/
  fp1 = fopen("/home/FILE4C.TXT","r codepage=037");
   printf("%p\n",fp1);
   fgets(Bin, 15, fp1);
  fclose(fp1);

/*読み込んだデータの表示*/
  /*HEX表示*/
   printf("Hex = ");
   for (x=0; Bin[x]; x++)
     printf("%.2x", (int)(Bin[x]));
   printf("\n");
  /*テキスト表示*/
   printf("Bin = ");
     printf("%s", Bin);
 }

おそらく、ダブルバイトの文字も1バイトずつ処理され、CCSIDの変換を1バイトずつ行うようです。

現状では、日本語を含んでIFSを使用する場合は、バイナリーモードを使用するしか方法はなさそうです。

本来テキストモードであれは、FILEのCCSID<=>JOBのCCSID間でコード変換できるはずなので、 ASCII<=>EBCDIC間での変換をPGMで行わなくても良いはずなのですが...日本語はノンサポート です。

/*---------------------------------------------------------------*/
/* PROGRAM-ID  : FILE5C                                          */
/* REMARKS     :IFSファイルI/O  */
/* AUTHOR      : Y.Ide                                           */
/* DATE-WRITEN : 98/09/10                                        */
/* VERSION     : 01.00 ORIGINAL                                  */
/*---------------------------------------------------------------*/
/* 標準のCでは、ファイルはストリームファイルとして */
/* 扱われます。*/
/* AS/400のIFS(統合ファイルシステム)を使用すると*/
/* ストリームファイルがサポートされます。*/
/* バイナリーモードだと日本語でもOKです*/
/*  CRTBNDC SYSIFCOPT(IFSIO)でコンパイルすること*/

#include <stdio.h>

int main(void)
{
  FILE *fp1;
  char Bin[15];
  int x;

/*ファイル作成とデータ出力*/
  fp1 = fopen("/home/FILE5C.BIN","wb");
   printf("%p\n",fp1);
   fprintf(fp1,"漢字データ\n");
  fclose(fp1);

/*読み込み専用でファイルオープン*/
  fp1 = fopen("/home/FILE5C.BIN","rb");
   printf("%p\n",fp1);
   fgets(Bin, 15, fp1);
  fclose(fp1);

/*読み込んだデータの表示*/
  /*HEX表示*/
   printf("Hex = ");
   for (x=0; Bin[x]; x++)
     printf("%.2x", (int)(Bin[x]));
   printf("\n");
  /*テキスト表示*/
   printf("Bin = ");
     printf("%s", Bin);
 }

バイナリーモード(wb,rb)を使えば日本語の処理も問題なくできるはずです。

ただ、CCSIDの変換が自動的には行われないため、コード変換が必要な場合にはPGMの 内部で行う必要があります。