%表題   MISC1 (その他の基本処理下位パッケージ)
%
%履歴
%\Drireki{
%         91/12/17 塩谷雅人
%         92/03/14 塩谷雅人
%         92/04/13 塩谷雅人
%         92/04/22 林祥介   (4.1版)
%        }
%
\Dchapterhead
\label{fiolib}

\section{概要}

これは, 固定長の文字列データおよびバイナリデータの読み書きに関す
るサブルーチンパッケージである.
ftpなどのファイル転送ソフトを念頭において,
使用する機種によらずファイル操作の一元化を計ろうとするものである.
したがってファイルそのものの互換性はないが, 適切な転送手段によっ
てファイルの内容は保存され, 文字は文字レベルで, バイナリはバイナ
リレベルでハンドリングできることになる.

\vspace{1em}
このパッケージは次のような仕様にもとづいて設計されている.
\begin{enumerate}
  \item 固定長ファイルの入出力を取り扱う.
  \item 入力と出力は同時におこなわない.
  \item 出力は順次的におこなう.
  \item 入力はレコード番号を指定するランダムアクセスを許す.
  \item 行末の改行制御をするかどうかが指定できる.
  \item 書き込のためオープンすると既存のファイルは消去される.
\end{enumerate}

\vspace{1em}
このような仕様は, 以下の要請からきている.
\begin{itemize}
  \item unix系のマシンでは直接参照入出力を念頭においているので1を要請
      する.
  \item メインフレーム系のマシンでは順番参照入出力を念頭においている
      (ファイルシステムの違いから一般に直接参照入出力より順番参照入出
      力のアクセススピードの方が速い)ので2, 3を要請する.
  \item unix系のマシンでおこなう直接参照入出力の利点を生かしてランダム
      アクセスができることを要請する. ただしメインフレーム系の順番参照
      入出力では出力時にレコード番号を指定するようなやりかたは非現実的
      であり, 実際われわれの使用形態のほとんどの場合が順番参照的である
      ことから, 4によって入力時のみ疑似的なランダムアクセスを要請する.
  \item unix系の文字入出力を念頭において5の要請がある.
  \item 既存のファイルサイズが上書きするファイルサイズより大きいような
      直接参照出力をおこなうとき, 以前のファイル内容の一部が残ってしま
      うので6を要請する.
\end{itemize}

\vspace{1em}
以下のサブルーチン群を使用するにあたっては次の点に注意すること.
\begin{itemize}
  \item 入出力装置番号の妥当性はチェックしない.
  \item レコード長の妥当性はチェックしない.
  \item レコード番号の妥当性はチェックしない.
  \item 指定できる入出力装置番号は1から99である.
\end{itemize}

\vspace{1em}
なお以下の説明で共通してあらわれるコンディションコードは,
正常終了していれば0が, そうでなければ0以外の整数値が返される.

\section{サブルーチンのリスト}
\begin{tabular}{lp{10cm}}
  {\tt FCOPEN(IOU,CDSN,NRL,CACT,ICON)} & ファイルをオープンする. \\
  {\tt FCCLOS(IOU,ICON)} & ファイルをクローズする. \\
  {\tt FCSLFC(CLX)} & 行末の改行文字を設定する. \\
  {\tt FCLEOL(IOU,LEOL)} & 行末の改行制御を指定する. \\
  {\tt FCNREC(IOU,NREC)} & レコード番号を指定する. \\
  {\tt FCGETR(IOU,CBUF,ICON)} & 1レコードを(文字列で)読み込む. \\
  {\tt FCPUTR(IOU,CBUF,ICON)} & 1レコードを(文字列で)書き出す. \\
  {\tt FCGETS(IOU,IBUF,ICON)} & 1レコードを(配列で)読み込む. \\
  {\tt FCPUTS(IOU,IBUF,ICON)} & 1レコードを(配列で)書き出す. \\
  {\tt FCRWND(IOU,ICON)} & リワインドする.
\end{tabular}

\section{サブルーチンの説明}

\subsection{FCOPEN}
\label{fiolib.sub.fcopen}
\begin{enumerate}
  \item 機能
  \begin{quote}
    ファイルをオープンする.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCOPEN(IOU,CDSN,NRL,CACT,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt CDSN}  & {\tt (C*(*))} & ファイル名. \\
      {\tt NRL}   & {\tt (I)} & レコード長. \\
      {\tt CACT}  & {\tt (C*1)} & 入出力モードの指定.
                    読み込みのとき{\tt 'R'}, 書き込みのとき{\tt 'W'}を
                    指定する. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 書き込のためオープンすると既存のファイルは消去される.
  \end{enumerate}
\end{enumerate}

\subsection{FCCLOS}
\label{fiolib.sub.fcclos}
\begin{enumerate}
  \item 機能
  \begin{quote}
    ファイルをクローズする.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCCLOS(IOU,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし.
  \end{enumerate}
\end{enumerate}

\subsection{FCSLFC}
\label{fiolib.sub.fcslfc}
\begin{enumerate}
  \item 機能
  \begin{quote}
    行末の改行文字を設定する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCSLFC(CLX)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt CLX}   & {\tt (C*(*))} & 指定する改行文字.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item 改行文字はふつうシステムごとに定められているが,
      特定のシステムを念頭においてファイルを作成するときに
      このサブルーチンを使用すればよい.
    \item {\tt FCLEOL}の前に呼ばなければならない.
    \item 改行文字は2文字以下でなければならない.
  \end{enumerate}
\end{enumerate}

\subsection{FCLEOL}
\label{fiolib.sub.fcleol}
\begin{enumerate}
  \item 機能
  \begin{quote}
    行末の改行制御をするかどうかを指定する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCLEOL(IOU,LEOL)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt LEOL}  & {\tt (L)} & 改行制御の指定をする.
                    {\tt .TRUE.}なら改行制御をする;
                    {\tt .FALSE.}ならしない.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt FCOPEN}の前に呼ばなければならない.
    \item このルーチンを呼んでいないときの省略値は{\tt .FALSE.}である.
      文字入出力を取り扱うときには, {\tt .TRUE.}を明示的に指定すべき
      である.
  \end{enumerate}
\end{enumerate}

\subsection{FCNREC}
\label{fiolib.sub.fcnrec}
\begin{enumerate}
  \item 機能
  \begin{quote}
    レコード番号を指定する.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCNREC(IOU,NREC)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt NREC}  & {\tt (I)} & レコード番号. 1以上の整数値.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item ここで指定したレコード番号は, 次の{\tt FCGETR}または
          {\tt FCGETS}で有効になる.
    \item このサブルーチンは読み込みモードでのみ使用できる.
  \end{enumerate}
\end{enumerate}

\subsection{FCGETR}
\label{fiolib.sub.fcgetr}
\begin{enumerate}
  \item 機能
  \begin{quote}
    1レコードを(文字列で)読み込む.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCGETR(IOU,CBUF,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt CBUF}  & {\tt (C*(*))} & 読み込むデータレコード. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt CBUF}の長さは{\tt NRL} ( {\tt FCOPEN}参照)
          でなければならない.
    \item {\tt FCNREC}によってレコード番号が指定されていなければ,
          先頭のレコードから順に読み込む;
          レコード番号が指定されていれば,
          先頭のレコードを1として指定されたレコード番号のレコードから
          読み込む.
  \end{enumerate}
\end{enumerate}

\subsection{FCPUTR}
\label{fiolib.sub.fcputr}
\begin{enumerate}
  \item 機能
  \begin{quote}
    1レコードを(文字列で)書き込む.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCPUTR(IOU,CBUF,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt CBUF}  & {\tt (C*(*))} & 書き込むデータレコード.
                    長さ{\tt NRL} ( {\tt FCOPEN}参照)の文字列で指定する. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt CBUF}の長さは{\tt NRL} ( {\tt FCOPEN}参照)
          でなければならない.
    \item 書き込みは先頭のレコードから順におこなわれる.
  \end{enumerate}
\end{enumerate}

\subsection{FCGETS}
\label{fiolib.sub.fcgets}
\begin{enumerate}
  \item 機能
  \begin{quote}
    1レコードを(配列で)読み込む.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCGETS(IOU,IBUF,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt IBUF}  & {\tt (I)} & 読み込むデータレコード. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt IBUF}の長さに4をかけたものが
          {\tt NRL} ( {\tt FCOPEN}参照)となっていなければならない.
    \item {\tt FCNREC}によってレコード番号が指定されていなければ,
          先頭のレコードから順に読み込む;
          レコード番号が指定されていれば,
          先頭のレコードを1として指定されたレコード番号のレコードから
          読み込む.
  \end{enumerate}
\end{enumerate}

\subsection{FCPUTS}
\label{fiolib.sub.fcputs}
\begin{enumerate}
  \item 機能
  \begin{quote}
    1レコードを(配列で)書き込む.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCPUTS(IOU,IBUF,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt IBUF}  & {\tt (I)} & 書き込むデータレコード. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item {\tt IBUF}の長さに4をかけたものが
          {\tt NRL} ( {\tt FCOPEN}参照)となっていなければならない.
    \item 書き込みは先頭のレコードから順におこなわれる.
  \end{enumerate}
\end{enumerate}

\subsection{FCRWND}
\label{fiolib.sub.fcrwnd}
\begin{enumerate}
  \item 機能
  \begin{quote}
    リワインドする.
  \end{quote}
  \item 呼び出し方法
  \begin{quote}
    {\tt CALL FCRWND(IOU,ICON)}
  \end{quote}
  \item パラメーターの説明
  \begin{quote}
    \begin{tabular}{llp{10cm}}
      {\tt IOU}   & {\tt (I)} & 入出力装置番号. \\
      {\tt ICON}  & {\tt (I)} & コンディションコード.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item なし.
  \end{enumerate}
\end{enumerate}

