UWSC|ファイル操作の自作関数

ポク太郎です。

コンピュータ処理の結果は記録しないと意味がありません。「言われた通り計算しました」だけでは「昨日皆で行った焼き肉美味しかったよ」と話だけ聞かされるのと同じです。

通常やりたいケースとは、結果残したり、前回の設定読み込んだり。

でも、開発環境によりファイル操作に関する命令が異。てことで、UWSCでのファイル操作が自分が使う他環境と同じ仕様になるよう自作関数を作っておきます。(テキストファイルが対象。)


省略パスを修正するchk_path()関数

関数の仕様として、フルパスでなくファイル名のみ指定された場合は実行ファイル.exeと同じフォルダ内を指定されたものとすることに。そのために一つ関数を準備しておきます。

FUNCTION chk_path(path)
   //   ファイル名だけ渡された場合は
   //   実行ファイルのある場所(GET_CUR_DIR)に変換する
         IF (left(path,2)="\\")//ネットワークフォルダ指定された
         ELSEIF (keyword(path,":\")=1)//フルパス指定された
         ELSE
            path=GET_CUR_DIR+"\"+path
         ENDIF
            RESULT=path
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,10行目 1
10
FUNCTION chk_path(path)
FEND
chk_path(path)関数宣言:引数pathとしてファイル名だけ渡された場合に、実行ファイル(.exe)のあるフォルダと同じ位置のパスに修正して返す関数。
4~6,8行目 4
5
6
8
         IF (left(path,2)=\\)//ネットワークフォルダ指定された
         ELSEIF (keyword(path,:\)=1)//フルパス指定された
         ELSE
         ENDIF
ネットワークフォルダが指定された、引数path中に”:\“が存在した(←C:\windowsなどのハードディスクを示す記号。)場合は、
 ⇒ 何もしない
それ以外の場合は、7行目を実行。

4行目:left(path,2)UWSC|ファイル操作の自作関数で作成した自作関数、5行目:keyword(path,”:\”)UWSC|文字列中の指定キーワードありなし判定する関数で作成した自作関数。

7行目 7             path=GET_CUR_DIR+\+path
引数pathを書き換える。
GET_CUR_DIRはUSWCの特殊変数。実行ファイルのパスが入っています。
9行目 9             RESULT=path
条件によっては書き換えられた引数pathを戻り値として返します。

ファイルの有無を調べるfile_exists()関数

ファイルが無いのに開けと命令するとエラーで止まってしまうので、存在有無は頻繁に調査。なので、ファイルの存在を調べる関数を準備します。

FUNCTION file_exists(path)
            path=chk_path(path)
         IF (FOPEN(path,F_EXISTS)=1)
            RESULT=1
         ELSE
            RESULT=0
         ENDIF
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,8行目 1
8
FUNCTION file_exists(path)
FEND
file_exists(path)関数宣言:引数pathとして渡されたファイルが存在するかどうかを調べる関数。(ただの翻訳関数です。)
存在した  :1を返す。
存在しない :0を返す。
2行目 2             path=chk_path(path)
上で作成した関数に引数pathを渡し引数を修正します。
3,5,7行目 3
5
7
         IF (FOPEN(path,F_EXISTS)=1)
         ELSE
         ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 4行目を実行
×⇒ (存在しなかった) 6行目を実行

FOPEN(パス,F_EXISTS)は、パスで指定されたファイルがある場合は1、無い場合は0を返すUWSC標準関数です。

4行目 4             RESULT=1
” RESULT=1″
6行目 6             RESULT=0
” RESULT=0″

ファイルを削除するfile_del()関数

ファイルを削除する関数です。削除するファイルのパスを引数として渡して指定します。

FUNCTION file_del(path)
            path=chk_path(path)
         IF (FOPEN(path,F_EXISTS)=1)
            comm="del "+path
            DOSCMD(comm)
            RESULT=1
         ELSE
            RESULT=0
         ENDIF
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,10行目 1
10
FUNCTION file_del(path)
FEND
file_del(path)関数宣言:引数pathとして渡されたファイルを削除する関数。
成功した場合は1を返し、ファイルが無かった場合は0を返します。
2行目 2             path=chk_path(path)
上で作成した関数に引数pathを渡し引数を修正します。
3,7,9行目 3
7
9
         IF (FOPEN(path,F_EXISTS)=1)
         ELSE
         ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 4~6行目を実行
×⇒ (存在しなかった) 8行目を実行

敢えて上で作成したfile_exists()関数は使用していません。

4~6行目 4
5
6
            comm=del +path
            DOSCMD(comm)
            RESULT=1
ファイルの削除はDOS窓の機能を利用します。”del パス”というコマンドをDOS窓に与えるとファイルを削除します。

4行目: 変数commを定義して、”del “という文言を変数pathの前に付けます。これはDOSコマンドを作っています。
5行目: 作成したコマンドをDOS窓へ与えます。DOSCMD(コマンド)はDOS窓にコマンドを渡せというUWSCの命令です。
6行目: 関数の戻り値として、1を返します。

8行目 8             RESULT=0
関数の戻り値として0を返します。

ファイルに書込を行うfile_save()関数

ファイルに書き込みを行う関数です。引数としてパス、書き込むデータ、モード番号を渡す仕様としました。モード番号で上書きモードと追記モードを選択します。

FUNCTION file_save(path,dt,mode)//mode=0:上書き、=1:追加
            path=chk_path(path)
         SELECT mode
         CASE 0
            file=FOPEN(path,F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
         CASE 1
   //   FOPEN()関数には、読み書き両用モード(F_READ OR F_WRITE)
   //   このモードで書き込み行と書き込み列を省略して書き込みすると、
   //   末尾に改行+書き込み。
            file=FOPEN(path,F_READ or F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
         SELEND
            RESULT=1
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,17行目 1
17
FUNCTION file_save(path,dt,mode)//mode=0:上書き、=1:追加
FEND
file_save(path,dt,mode)関数宣言:データをテキストファイルに書き込む関数。
引数path :ファイルのパス
引数dt  :書き込むデータ
引数mode :0:上書きモード、1:追記モード
2行目 2             path=chk_path(path)
上で作成した関数に引数pathを渡し引数を修正します。
3~4,8,15行目 3
4
8
15
         SELECT mode
         CASE 0
         CASE 1
         SELEND
変数modeの値により分岐します。
(変数mode=0:上書きモードなら) ⇒ 5~7行目を実行。
(変数mode=1:追記モードなら) ⇒ 12~14行目を実行。
5~7行目 5
6
7
            file=FOPEN(path,F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
以下はUWSCの命令。
FOPEN(パス,F_WRITE1)(←※)は、パスで指定されたファイルを書き込みモードで開く。戻り値はファイルID。ファイルが存在しない場合は作成します。
FPUT(ファイルID,データ)は、指定されたファイルIDにデータを上書きする命令。
FCLOSE(ファイルID)は、ファイルを閉じる命令。

FOPEN(パス,F_WRITE)を使用してましたが、F_WRITE1(SJIS用)に修正。文字列変数を書き込む際に文字化けするため。(2017年7月22日修正)
12~14行目 12
13
14
            file=FOPEN(path,F_READ or F_WRITE1)
            FPUT(file,dt)
            FCLOSE(file)
以下はUWSCの命令。
16行目 16             RESULT=1
関数の戻り値として1を返します。

ファイルから読み込むfile_load()関数

ファイル内容を読み込むための関数。読み込み方はテキストファイルの各行を配列変数に代入→それを返す仕様としました。

例えば、10行目の内容は配列[9]に代入されて帰ってきます。使い方はソース2~6行目のコメントアウト。

FUNCTION file_load(path)
//           呼び出し側ソース
//            fdt=path("ファイルパス")
//            先頭行=fdt[0]
//            最終行=fdt[ubound(fdt)]
//   n行目に書かれているデータは呼び出し側配列fdt[n-1]に入る
            path=chk_path(path)
      IF (FOPEN(path,F_EXISTS)=1)
            file=FOPEN(path,F_READ)
            n=FGET(file,F_LINECOUNT)
            DIM read[n-1]
         FOR i=0 TO n-1
            read[i]=FGET(file,i+1,1)
         NEXT
            FCLOSE(file)
      ELSE
            DIM read[0]
            read[0]="ファイルが見つかりません。"
      ENDIF
            RESULT=SLICE(read,0,length(read)-1)
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,21行目 1
21
FUNCTION file_load(path)
FEND
file_load(path)関数宣言:テキストファイルからデータを読み込んで配列に代入して返す関数。
引数path :ファイルのパス

呼び出し側は3行目のコメントにある方法で呼び出します。配列変数の見方は4~6行目。

7行目 7             path=chk_path(path)
上で作成した関数に引数pathを渡し引数を修正します。
8,16,19行目 8
16
19
      IF (FOPEN(path,F_EXISTS)=1)
      ELSE
      ENDIF
(条件式)引数pathのファイルが存在したかどうか
○⇒ (存在した) 9~15行目を実行
×⇒ (存在しなかった) 17、18行目を実行

敢えて上で作成したfile_exists()関数は使用していません。

9~15行目 9
10
11
12
13
14
15
            file=FOPEN(path,F_READ)
            n=FGET(file,F_LINECOUNT)
            DIM read[n1]
         FOR i=0 TO n1
            read[i]=FGET(file,i+1,1)
         NEXT
            FCLOSE(file)
以下はUWSCの命令。
FOPEN(パス,F_READ)は、パスで指定されたファイルを読み込みモードで開く。戻り値はファイルID。
FGET(ファイルID,F_LINCOUT)は、指定されたファイルが何行あるかを返す関数。FGET(ファイルID,N1,N2)とすると、N1行目からN2行分のデータを返します。ファイルの1行目がN1=1です。
FCLOSE(ファイルID)は、ファイルを閉じる命令。

9行目: ファイルIDを得ます。
10行目: 変数nに全部で何行あるかを代入します。
11行目; 配列変数read[]を行数分定義します。
12~14行目: 配列変数read[]にファイルの1行づつ代入していきます。
15行目: ファイルを閉じます。

17,18行目 17
18
            DIM read[0]
            read[0]=ファイルが見つかりません。
ファイルが存在しなかったので、配列の要素0番にその由を代入して返します。
20行目 20             RESULT=SLICE(read,0,length(read)1)
関数の戻り値として配列変数を返します。

ファイル操作の話題
ファイル操作の関数 iniファイルを扱う関数 現在のタイムスタンプ文字列を返す関数 高圧縮jpegと非劣化bmp画像を取得する関数
本記事の内容は以下でした。
○ファイル操作の関数

戻値(str)=chk_path(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)

コメント

タイトルとURLをコピーしました