統合ファイルシステムを使ってみよう!
残念ながら、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の
内部で行う必要があります。
|