C/400

12. DB2/400データ・ベースの レコード単位の読み取り

さていよいよ、ライブラリー・システムでのいわゆるファイルをレコード毎に読み取る方法を紹介する。
最初に一般的なレコード単位での読み取り方法を学習した後で究極のテクニックも後に紹介する。
解説書などでは fgets関数 によって1バイトずつ読み取る手法が紹介されているが、
もちろんそれでは実用的ではない。
学習の無駄の無いように真のレコード単位での読み取りを紹介する。

0001.00 #include <stdio.h>
0002.00 #include <stdlib.h>
0003.00 #include <string.h>
0004.00 #include <recio.h>
0005.00                                                             
0006.00 #define TRUE         0                                      
0007.00 #define FALSE       -1                                      
0008.00 #define MAX_LEN 3000                                        
0009.00                                                             
0010.00 void main(void){                                            
0011.00     _RFILE *fp;                                             
0012.00    _RIOFB_T *iofb;                                          
0013.00     char buff[256];                                         
0014.00                                                             
0015.00     fp = _Ropen("QTRFIL/SHOHIN", "rr");                     
0016.00      if(fp == NULL){                                        
0017.00          printf("Open failed for open file\n");getchar();   
0018.00      }                                                      
0019.00     while(1){                                               
0020.00       iofb = _Rreadn(fp, buff, MAX_LEN, __DFT);             
0021.00       if(iofb->num_bytes == EOF) break; 
0022.00       printf("buff = %s\n", buff);      
0023.00     }                                   
0024.00    _Rclose(fp);                         
0025.00     getchar();                          
0026.00 }

最初に

#include <recio.h>

によってレコード単位の処理のヘッダーを読み込む。このヘッダーは C言語一般のみのではなく
iSeries400のレコード処理のために提供されているヘッダーである。
ファイルのオープンも open ではなく _Ropen によってオープンして _Rreadn によって
Nバイト単位で読み取り、最後には _Rclose によってクローズする。
このような例は「C/400プログラマーの手引き」に多く紹介されているので詳細はそちらを参照されたい。