それでは早速、IFS へ HelloWorld ! と記載されたストリーム・ファイル(.TXT)を
IFS に /tmp/hello.txt として出力する事例を紹介しよう。
【サンプルRPG: RPGIFSWRT 】
0001.00 H DFTNAME(RPGIFSWRT) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 最も簡単な IFS 出力 *************************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 /COPY QSYSINC/QRPGLESRC,IFS 0006.00 *-------------------------------------------------------------------* 0007.00 * 2017/10/06 : 作成 0008.00 *-------------------------------------------------------------------* 0009.00 *( 作業変数 ) 0010.00 D FD S 10I 0 0011.00 D EBC_CCSID S 10I 0 INZ(5035) 0012.00 D ASC_CCSID S 10I 0 INZ(819) 0013.00 D DATA S 50A 0014.00 0015.00 /FREE 0016.00 FD = open('/tmp/hello.txt': O_CREAT + O_TRUNC + O_WRONLY + 0017.00 O_CCSID : O_RDWR : EBC_CCSID); 0018.00 IF (FD < 0); 0019.00 // エラーの処理をここに入れる。 0020.00 ENDIF; 0021.00 DATA = 'Hello World!' + X'0d25'; 0022.00 callp write(FD: %ADDR(DATA): %LEN(%TRIMR(DATA))); 0023.00 callp close(FD); 0024.00 *INLR = *ON; 0025.00 /END-FREE
【解説】
簡単なRPGソースであるがしっかり実用的な機能は備えている。
まず BNDDIR(‘QC2LE’) によって
C関数のライブラリーを参照してインクルードできるようにしている。
次に
/COPY QSYSINC/QRPGLESRC,IFS
によってシステムによって提供される IFSのプロトタイプ関数や定数を
インクルードできるようにしている。
FD = open('/tmp/hello.txt': O_CREAT + O_TRUNC + O_WRONLY + O_CCSID : O_RDWR : EBC_CCSID);
でストリーム・ファイル : /tmp/hello.txt を作成用として
( O_CREAT ) C言語の open 関数によってオープンしている。
O_TRUNC というオプションはなければ作成する、という意味である。
O_WRONLY というオプションは出力専用を意味している。
O_CCSID というオプションは作成するファイルのCCSID を指定している。
EBC_CCSID = 5035 を指示しているので CCSIDが 5035のストリーム・ファイルが作成される。
一般的に UNIX や Windowsのストリーム・ファイルの属性には CCSID はないが
IBM i の IFS のストリーム・ファイルにはちゃんとCCSIDが存在しており
WRKLNKコマンドの 5=表示で中身を見るときには CCSID に対応した表示が行われる。
一般的にIFSのストリーム・ファイルがASCII互換がほとんどであるので
正しくはCCSID=819
を指定しなければならないが、このサンプルでは
DATA = 'Hello World!' + X'0d25';
とRPGでの文字列「HelloWorld!」を入れているので CCSIDは 5035を指定している。
一般にこのような RPG によるIFSへの出力サンプルを見ると CCSID までは考慮されていないが
実用レベルでは CCSID の指定は必須である。
なお
X’0d25′ とは EBCDIC の改行コードである。
ASCII での改行コードは X’0d0a’ である。
このプログラム : RPGIFSWRT をコンパイルできたら
CALL RPGIFSWRT で実行して WRKLNK で中身を確認してほしい。
************* データの始め **************** Hello World! *********** データの終わり ******************
のようにして中身も正しく表示されるはずである。