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では自分で必ず行わねばならない。