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