C/400

10. IFSファイルの読み取り

C/400の基本が学習できてきたところでそろそろIFSファイルの読み取りの方法を紹介しよう。
ここでは任意の長さのIFSストリーム・ファイルの読み取りの実用的な例を紹介する。
処理の順序としては IFSファイルをまず、オープンしてからサイズを調べて必要な分だけの
メモリーを用意してそれに読み取りバッファーを入れるという方法である。
なお、IFSの処理に関する解説は「C/400プログラマーの手引き」や「C/400解説書」には解説されていない。
「統合ファイル・システム入門」に C/400による解説がなされている。

0001.00 #include <stdio.h>
0002.00 #include <stdlib.h>
0003.00 #include <string.h>
0004.00 #include <fcntl.h>
0005.00                                                  
0006.00 #define TRUE         0                           
0007.00 #define FALSE       -1                           
0008.00                                                  
0009.00 int  main(void){                                 
0010.00    int fildes;                                   
0011.00    struct stat info;                             
0012.00    char dir[256];                                
0013.00    long len;                                     
0014.00    unsigned char *buf;                           
0015.00    long byte_red;                                
0016.00                                                  
0017.00    memset(dir, 0, sizeof(dir));                  
0018.00    strcpy(dir, "/MYTEXT.TXT");                   
0019.00    fildes = FALSE;                               
0020.00    if((fildes = open(dir, O_RDONLY)) == FALSE){  
0021.00       printf("%s  が見つかりません。 \n", dir);       
0022.00       getchar();                                      
0023.00       return(FALSE);                                  
0024.00    }                                                  
0025.00    /*( ファイル・サイズを取得 )*/                     
0026.00    if(lstat(dir, &info) == FALSE){                    
0027.00       printf("%s  のサイズが取得できません。 \n", dir)
0028.00       getchar();                                      
0029.00       return(FALSE);                                  
0030.00    }                                                  
0031.00    len = (long)info.st_allocsize;                     
0032.00    /*( 読み取りバッファーを確保 )*/                   
0033.00    buf = (unsigned char *)malloc(len);                
0034.00    memset(buf, 0, sizeof(buf));                       
0035.00    byte_red = read(fildes, buf, len);                 
0036.00    buf[byte_red] = 0x00;                              
0037.00    close(fildes);                                     
0038.00    free(buf);                                         
0039.00    printf("%s  の読み取り成功。 \n", dir);            
0040.00     getchar();                                        
0041.00 }

最初の

#include <fcntl.h>

はファイルの open, read, close に必要なヘッダーである。
次に

fildes = open(dir, O_RDONLY)

で読み取り専用(O_RDONLY)ファイルで読み取る。他のパラメータについては解説書を参照のこと。

lstat(dir, &info)

でファイルの情報を取得してから

len = (long)info.st_allocsize;

でファイル・サイズを取得する。

buf = (unsigned char *)malloc(len);

で読み取りバッファー buf を確保してから

byte_red = read(fildes, buf, len);

で一挙にバッファーに読み込む。

よく参考事例で1バイトずつ読み込む方法が紹介されているが、それは学習用であって実用的ではない。

buf[byte_red] = 0x00;

でバッファーの最後に NULL-STOP を必ずいれて、処理が終われば

close(fildes);

でフィルをクローズして最後に

free(buf);

で確保したメモリの解放を忘れずに行うこと。
Java ではメモリの解放は自動的に行われるが C/400では自分で必ず行わねばならない。