ゲームを作りたい人のための ソースコード集

私がその日作った短めのソースを簡単な解説とともに載せていきます
ゲーム制作初心者にとって参考になるかもしれないソースが多いです


<< リアルタイムでテキストファイルの行数を取得 | main | Split改良版 >>



文字列読み込み(巨大テキストファイル用)

こちらの記事を参考に「noteget」の代わりに「instr & memcpy」でサイズが大きいテキストファイルを読み込むプログラムを作成しました

処理時間を計測し、どのくらい早くなったかを比較しています

また、複数の種類の改行コードにも対応させました

 

#include "mod_regexp.as"
sdim filestr
sdim tfilestr
sdim linestr,1000    ;一行につき千文字まで取得可能
;処理時間を計測するのに必要な諸々の設定
#uselib "kernel32"
#func QueryPFreq "QueryPerformanceFrequency" var
#func QueryPCount "QueryPerformanceCounter" var
dim lgint,4    ;LARGE_INTEGER構造体
#define _start QueryPFreq nFreq : QueryPCount nBefore
#define _goal QueryPCount lgint(2) : dwTime=strf("%%.3fmSec",1000.*(lgint(2)-nBefore)/nFreq)
;テキストファイル読み込み
dialog "",16
if stat{
    filedir=refstr
    chdir getpath(filedir,32)
    exist filedir
    filesize=strsize
    if filesize<0:end
    filename=getpath(filedir,1+8+2)
    notesel filestr
    noteload filedir
}else{
    end
}
;改行コードの取得
lf=strf("%c",10)
cr=strf("%c",13)
crlf=cr+lf
newlinecode=""
newlineln=0
if instr(filestr,0,crlf)>=0{
    newlinecode=crlf
    newlineln=2
}else:if instr(filestr,0,cr)>=0{
    newlinecode=cr
    newlineln=1
}else:if instr(filestr,0,lf)>=0{
    newlinecode=lf
    newlineln=1
}
;noteget の処理時間
_start    ;計測開始
id=0
lineln=0
tfilestr=""
nmax=notemax
repeat nmax
    noteget linestr,cnt
    gosub *lineprocess
loop
_goal    ;計測終了
pos 0:mes"noteget の処理時間 :"+dwTime
;instr & memcpy の処理時間
_start    ;計測開始
id=0
lineln=0
tfilestr=""
repeat
    lineln=instr(filestr,id,newlinecode)
    if lineln<0{
        if id<filesize{
            lineln=filesize-id
            bkflg=1
        }else{
            break
        }
    }
    memset linestr,0,1000    ;初期化しないと出力結果がおかしくなる
    memcpy linestr,filestr,lineln,0,id
    gosub *lineprocess
    if bkflg:break
    id+=lineln+newlineln
loop
_goal    ;計測終了
filestr=tfilestr
notesave "t_"+filename    ;変換ファイル出力
pos 0:mes"instr & memcpy の処理時間:"+dwTime
noteunsel
stop

;取得行処理
*lineprocess
    ;置換処理(a->b, あ->い)
    linestr=replace(linestr,"a","b")
    linestr=replace(linestr,"あ","い")
    tfilestr+=linestr+newlinecode    ;変換行を代入
    return

0
    posted by higashijugem 15:37comments(0)|-|


    この記事に対するコメント