前のページ|次のページ

FPOS関数

ファイルデータバッファ(FDB)の列ポインタの位置を設定します。

カテゴリ: 外部ファイル

構文

FPOS(file-id, nval)

必須引数

file-id

通常、FOPEN関数によってファイルが開かれたときに割り当てられた識別子を指定する数値変数です。

nval

ポインタを設定する列を指定する数値定数、変数または式です。

詳細

FPOSは、操作が成功した場合は0、失敗した場合は≠0を返します。出力モードでファイルを開く場合、指定した位置が現在のレコードの最後を超えると、レコードのサイズが適切に増加します。ただし、固定ブロックまたはVBAファイルの場合、レコードの最後を超える列位置を指定しても、レコードサイズは変更されず、テキスト文字列はファイルに書き込まれません。
更新モードでファイルを開く場合、指定した位置が現在のレコードの最後を超えていなければ、SASはレコードをファイルに書き込みます。指定した位置が現在のレコードの最後を超えている場合、SASはエラーメッセージを返し、新しいレコードを書き込みません。
ERROR: Cannot increase record length in update mode.
注: FOPEN関数で更新モードを使用する場合、FWRITE関数を実行する前にFREADを実行する必要があります。

この例では、ファイル参照名MYFILEを既存のファイルに割り当てて、更新モードでファイルを開こうとします。変数FIDの正の値が示すように、ファイルが正常に開かれた場合、SASはレコードを読み込み、ファイルのバッファの列12にデータを配置します。生成されるレコード長が元のレコード長以下の場合、SASはレコードを書き込み、ファイルを閉じます。生成されるレコード長が元のレコード長よりも大きい場合、SASはエラーメッセージをログに書き込みます。
%macro ptest;
%let filrf=myfile;
%let rc=%sysfunc(filename(filrf, test.txt));
%let fid=%sysfunc(fopen(&filrf, o));
%let rc=%sysfunc(fread(&fid));
%put &fid;
%if (&fid > 0) %then
   %do;
      %let dataline=This is some data.;
         /* Position at column 12 in the FDB. */
      %let rc=%sysfunc(fpos(&fid, 12));
      %put &rc one;
         /* Put the data in the FDB. */
      %let rc=%sysfunc(fput(&fid, &dataline));
      %put &rc two;
      %if (&rc ne 0) %then
         %do;
            %put %sysfunc(sysmsg());
         %end;
      %else %do; 
         /* Write the record. */
      %let rc=%sysfunc(fwrite(&fid));
      %if (&rc ne 0) %then
         %do;
            %put write fails &rc;
         %end;
      %end;
         /* Close the file. */
      %let rc=%sysfunc(fclose(&fid));
   %end;
%let rc=%sysfunc(filename(filrf));
%mend;
%ptest;
次の出力がログに書き込まれます。
1 0 one 0 two

関連項目:

前のページ|次のページ|ページの先頭へ