IFS

17. 最も簡単なIFSへ出力する RPG

それでは早速、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!                                  
 *********** データの終わり ******************

のようにして中身も正しく表示されるはずである。