ポク太郎です。
コンピュータ処理の結果は記録しないと意味がありません。「言われた通り計算しました」だけでは「昨日皆で行った焼き肉美味しかったよ」と話だけ聞かされるのと同じです。
通常やりたいケースとは、結果残したり、前回の設定読み込んだり。
でも、開発環境によりファイル操作に関する命令が異。てことで、UWSCでのファイル操作が自分が使う他環境と同じ仕様になるよう自作関数を作っておきます。(テキストファイルが対象。)
省略パスを修正するchk_path()関数
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コマンドを作っています。 |
||
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[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) |
関数の戻り値として配列変数を返します。 |
ファイル操作の関数 | iniファイルを扱う関数 | 現在のタイムスタンプ文字列を返す関数 | 高圧縮jpegと非劣化bmp画像を取得する関数 |
○ファイル操作の関数
戻値(int)=file_exists(path)
戻値(int)=file_del(path)
戻値(int)=file_save(path,dt,mode)
戻値(ARY)=file_load(path)
コメント