UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
今回は、今回は、ファイル操作を行うための関数をいくつか作りました。
今回は、今回は、ファイル操作を行うための関数をいくつか作りました。
記事の内容
○ファイル操作の関数
○ファイル操作の関数
戻値(str)=chk_path(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)
せっかくコンピュータで処理しているわけですから、結果を残したり、前回の設定を読み込んだり色々したいわけです。でも、開発環境によってファイル操作に関しての命令が異なります。
というわけで、自分が使っている他の環境と同じ仕様となるようUWSCでのファイル操作を関数としてまとめておきます。(テキストファイルが対象です。)
省略パスを修正するchk_path()関数
関数の仕様として、ファイル名のみ指定された場合は.exeと同じフォルダ内を指定されたものとすることにします。そのために一つ関数を準備しておきます。
1 2 3 4 5 6 7 8 9 10 | 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]ファイル操作の関数 [自作関数)で作成した自作関数。 | ||
7行目 | 7 | path=GET_CUR_DIR+“\“+path |
引数pathを書き換える。 GET_CUR_DIRはUSWCの特殊変数。実行ファイルのパスが入っています。 | ||
9行目 | 9 | RESULT=path |
条件によっては書き換えられた引数pathを戻り値として返します。 |
ファイルの有無を調べるfile_exists()関数
ファイルが無いのに開けと命令してしまうとエラーが出てプログラムが止まってしまいます。そのため、ファイルが存在するかどうかは頻繁に調べますので、ファイルの存在を調べる関数を準備します。
1 2 3 4 5 6 7 8 | 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()関数
ファイルを削除する関数です。削除するファイルのパスを引数として渡して指定します。
1 2 3 4 5 6 7 8 9 10 | 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コマンドを作っています。 | ||
8行目 | 8 | RESULT=0 |
関数の戻り値として0を返します。 |
ファイルに書込を行うfile_save()関数
ファイルに書き込みを行う関数です。引数としてパス、書き込むデータ、モード番号を渡す仕様としました。モード番号で上書きモードと追記モードを選択します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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の命令。 FOPEN(パス,F_READ or F_WRITE1)(←※)は、パスで指定されたファイルを読み書きモードで開く。ファイルIDが帰ってきます。ファイルが存在しない場合は作成します。 ※FOPEN(パス,F_WRITE)を使用してましたが、F_WRITE1(SJIS用)に修正。文字列変数を書き込む際に文字化けするため。(2017年7月22日修正) | ||
16行目 | 16 | RESULT=1 |
関数の戻り値として1を返します。 |
ファイルから読み込むfile_load()関数
ファイルの中身を読み込むための関数。読み込み方は、テキストファイルの各行を配列変数に代入してそれを返す仕様としました。例えば、10行目の内容は配列[9]に代入されて帰ってきます。ソースの2~6行目に使い方がコメントアウトで書かれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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[n–1] FOR i=0 TO n–1 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を得ます。 | ||
17,18行目 | 17 18 | DIM read[0] read[0]=“ファイルが見つかりません。“ |
ファイルが存在しなかったので、配列の要素0番にその由を代入して返します。 | ||
20行目 | 20 | RESULT=SLICE(read,0,length(read)–1) |
関数の戻り値として配列変数を返します。 |
記事の内容は伝わりましたでしょうか。
○ファイル操作の関数
○ファイル操作の関数
戻値(str)=chk_path(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)
コメント