第5章  PRTFも使えるの?
RPGプログラマーの為のC言語講座

PRTFを使用して、印刷スプールを作ってみましょう。

     H            Y/                                    1
     H*------------------------------------------------------------*
     H* PROGRAM-ID    :    PRT1R                                   *
     H* REMARKS       :   印刷のプログラム
     H* AUTHOR        :    Y.IDE                                   *
     H* DATE-WRITEN   :    98/09/23                                *
     H* VERSION       :    01.00 ORIGINAL                          *
     H*------------------------------------------------------------*
     FQPRINT  O   F     132     OF     PRINTER
     C*
     C                     MOVE *ALL'='   LINE   50
     C*印刷出力
     C                     EXCPTP#HDR
     C           1         DO   5         X       30
     C                     EXCPTP#DTL
     C                     ENDDO
     C*
     C                     SETON                     LR
     C                     RETRN
     OQPRINT  E   0305         P#HDR
     O                                   45 'CLABサンプル'
     O                         UDATE Y   70
     OQPRINT  E  2             P#DTL
     O                         X         10
     O                                   14 '行'
     O                         LINE    +001

[プログラムの解説]

    内部記述でPRTFを定義してあります。EXCPT命令で、まずヘッダーを出力してから、
    1行から5行のラインを出力してプログラム終了します。

出力結果は以下のようになります

                           スプール・ファイルの表示                          
 ファイル . . . :   QPRINT                           ページ/行  1/3         
 制御 . . . . . .                                    桁          1 - 75      
 検索 . . . . . .                                                            
 *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+ 
                             CLABサンプル                  98/09/23      
 001 行  ==================================================           
 002 行  ==================================================           
 003 行  ==================================================           
 004 行  ==================================================           
 005 行  ==================================================           

C言語で書き直してみましょう!

/*---------------------------------------------------------------*/
/* PROGRAM-ID  : PRT1C                                           */
/* REMARKS     : 印刷PGM                                       */
/* AUTHOR      : Y.Ide                                           */
/* DATE-WRITEN : 98/09/23                                        */
/* VERSION     : 01.00 ORIGINAL                                  */
/*---------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <recio.h>
#include <errno.h>

_RIOFB_T                     *rfb;

/*----------------------------------------*/
 void main(){
/*----------------------------------------*/
  char outbuf[99999];
  char line[51];
  _RFILE  *fp;
  size_t  size = 133;
  int i;

  memset(line,'=',50);

 /* PRINT File Open */
  if ((fp = _Ropen("QPRINT","wr riofb=N lrecl=132")) == NULL)
  {
    printf("OPEN FAILED\n");
    exit(1);
  }

  memset(outbuf,' ',132);
  memcpy(&outbuf[29],"CLABサンプル",18);

  rfb =  _Rwrite( fp, outbuf, size);

  for (i=1;i<=5;i++){
    memset(outbuf,' ',132);
    sprintf(outbuf,"      %d行%s",i,line);
    rfb =  _Rwrite( fp, outbuf, size);
  }

   _Rclose(fp);

}

[プログラムの解説]

    RPGでは、出力仕様書に行スキップがありましたが、Cでは、行間隔はPGMでコントロールが必要です。

    日付/ページなども、RPGでは予約語/編集語などがあり、簡単に日付印刷などが可能ですが、Cでは、 それらもプログラムで行う必要があります。(多くのサービス関数が提供されているので利用可能です)

    上記Cプログラムは、細かい位置合わせ,日付の表示、数値編集などについては省略しています。
    もし、気が向いた方は、ご自分で追加してみてください。