作成者 |
メッセージ |
|
|
'ファイルハンドルから1行読込みます。
'1行の終端はCR+LFまたはCRまたはLFまたはEOF。カンマやタブやスペースは行の終端としません。
'読込み開始ポインターが行の先頭であるかはチェックしません。処理開始時のポインターから取得を開始します。
'読込み後のポインターは次行の先頭に移動します。
'旧BASICでの LineInput# と同等な感じのルーチンです。
'他に方法があるかも知れませんが、探せなかったので作りました。
'多少は見やすくなったと思いますが、、、自分のスタイルもありますのでこれくらいで勘弁してくださいまし。
'ポインターの微妙なズレを補正しました。
'zFihInpLin 戻値 0=正常終了,1=読込みエラー。
'zHDL 引数 ファイルハンドル番号。処理内のzHDL--は_System_hFile対応の為です。
'zLIN 戻値 読込まれた1行の文字列です。CRやLFは含みません。長さの限界はString変数の限界と同等だと思います。かな?
コード: Function zFihInpLin( zHDL as Byte, ByRef zLIN as String) as Byte
Dim zDAT as String, zLEN as DWord, zPTR as DWord, zSTR as String, zWOR as Word, zLON as Long, z1 as DWord
zFihInpLin=0: zLIN=""
zHDL--: zDAT=ZeroString(100)
zPTR=SetFilePointer(_System_hFile(zHDL),0,NULL,FILE_CURRENT) as DWord
If zPTR=&HFFFFFFFF then zFihInpLin=1: Exit Function
Do
ReadFile(_System_hFile[zHDL],StrPtr(zDAT),100,VarPtr(zLEN),ByVal 0)
For z1=1 to zLEN
If zDAT[z1-1]=10 then zWOR=z1-1 as Word: zStrGetLftByt(zDAT,zWOR): zLIN=zLIN+zDAT: zPTR=zPTR+z1: Exit Do
If zDAT[z1-1]<>13 then Continue
zSTR=zDAT: zWOR=z1-1 as Word: zStrGetLftByt(zSTR,zWOR): zLIN=zLIN+zSTR: zPTR=zPTR+z1
If z1<100 then If zDAT[z1]=10 then zPTR++: Exit Do else Exit Do
ReadFile(_System_hFile[zHDL],StrPtr(zDAT),1,VarPtr(zLEN),ByVal 0)
If zLEN=1 and zDAT[0]=10 then zPTR++
Exit Do
Next z1
zPTR=zPTR+zLEN
If zLEN=100 then zLIN=zLIN+zDAT: Continue
zWOR=zLEN as Word: zStrGetLftByt(zDAT,zWOR): zLIN=zLIN+zDAT: Exit Do
Loop
zLON=zPTR as Long: SetFilePointer(_System_hFile(zHDL),zLON,NULL,FILE_BEGIN)
End Function
'文字列の左側から指定バイト数で取得します。(なんでLeft$()を使わないかは聞かないでね)
'zSTR 引数 取得元の文字列。
'zSTR 戻値 取得後の文字列。
'zBYT 引数 取得バイト数。
コード: Sub zStrGetLftByt( ByRef zSTR as String, zBYT as Word)
Dim zSSW as String
If zBYT=0 then zSTR="": Exit Sub
If Len(zSTR)<=zBYT then Exit Sub
zSSW=zSTR
zSTR=ZeroString(zBYT)
memcpy(StrPtr(zSTR),StrPtr(zSSW),zBYT)
End Sub
'ファイルハンドルから1行読込みます。 '1行の終端はCR+LFまたはCRまたはLFまたはEOF。カンマやタブやスペースは行の終端としません。 '読込み開始ポインターが行の先頭であるかはチェックしません。処理開始時のポインターから取得を開始します。 '読込み後のポインターは次行の先頭に移動します。 '旧BASICでの LineInput# と同等な感じのルーチンです。 '他に方法があるかも知れませんが、探せなかったので作りました。 '多少は見やすくなったと思いますが、、、自分のスタイルもありますのでこれくらいで勘弁してくださいまし。 'ポインターの微妙なズレを補正しました。 'zFihInpLin 戻値 0=正常終了,1=読込みエラー。 'zHDL 引数 ファイルハンドル番号。処理内のzHDL--は_System_hFile対応の為です。 'zLIN 戻値 読込まれた1行の文字列です。CRやLFは含みません。長さの限界はString変数の限界と同等だと思います。かな? [code]Function zFihInpLin( zHDL as Byte, ByRef zLIN as String) as Byte Dim zDAT as String, zLEN as DWord, zPTR as DWord, zSTR as String, zWOR as Word, zLON as Long, z1 as DWord zFihInpLin=0: zLIN=""
zHDL--: zDAT=ZeroString(100) zPTR=SetFilePointer(_System_hFile(zHDL),0,NULL,FILE_CURRENT) as DWord If zPTR=&HFFFFFFFF then zFihInpLin=1: Exit Function
Do ReadFile(_System_hFile[zHDL],StrPtr(zDAT),100,VarPtr(zLEN),ByVal 0)
For z1=1 to zLEN If zDAT[z1-1]=10 then zWOR=z1-1 as Word: zStrGetLftByt(zDAT,zWOR): zLIN=zLIN+zDAT: zPTR=zPTR+z1: Exit Do If zDAT[z1-1]<>13 then Continue zSTR=zDAT: zWOR=z1-1 as Word: zStrGetLftByt(zSTR,zWOR): zLIN=zLIN+zSTR: zPTR=zPTR+z1 If z1<100 then If zDAT[z1]=10 then zPTR++: Exit Do else Exit Do ReadFile(_System_hFile[zHDL],StrPtr(zDAT),1,VarPtr(zLEN),ByVal 0) If zLEN=1 and zDAT[0]=10 then zPTR++ Exit Do Next z1
zPTR=zPTR+zLEN If zLEN=100 then zLIN=zLIN+zDAT: Continue zWOR=zLEN as Word: zStrGetLftByt(zDAT,zWOR): zLIN=zLIN+zDAT: Exit Do Loop
zLON=zPTR as Long: SetFilePointer(_System_hFile(zHDL),zLON,NULL,FILE_BEGIN) End Function[/code] '文字列の左側から指定バイト数で取得します。(なんでLeft$()を使わないかは聞かないでね) 'zSTR 引数 取得元の文字列。 'zSTR 戻値 取得後の文字列。 'zBYT 引数 取得バイト数。 [code]Sub zStrGetLftByt( ByRef zSTR as String, zBYT as Word) Dim zSSW as String If zBYT=0 then zSTR="": Exit Sub If Len(zSTR)<=zBYT then Exit Sub zSSW=zSTR zSTR=ZeroString(zBYT) memcpy(StrPtr(zSTR),StrPtr(zSSW),zBYT) End Sub[/code]
|
|
|
投稿記事 |
Posted: 2009年2月13日(金) 21:50 |
|
|
|
|
|
少し古い記事ですが、
http://www.activebasic.com/forum/viewtopic.php?t=214
に別解が載ってたりします。
ところでコロンやら無理な圧縮やらで読みにくいので、内容を変更せずに見やすくしてみました。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]変数や関数名が全部大文字だと読みにくいのは私だけでしょうか? コード: ''''' FileHandleInputLine ファイル・ハンドル・読込み・行
Function ZFIHILL(ZHDL As Long) As String
Dim ZADD As String,ZBBB[1] As Byte,ZGET As DWord,ZRET As Long,Z1 As Long
ZHDL = ZHDL - 1
SetFilePointer(_System_hFile[ZHDL],-1,0,FILE_CURRENT)
ZFIHILL = ""
ZADD = ZeroString(100)
ZRET = 0
Do
For Z1 = 0 To 99
Do
ReadFile(_System_hFile[ZHDL],ZBBB,1,VarPtr(ZGET),ByVal 0)
ZADD[Z1] = ZBBB[0]
If ZGET = 0 Then Exit For
If ZBBB[0] = 10 Then
SetFilePointer(_System_hFile[ZHDL],1,0,FILE_CURRENT)
Exit For
Else If ZBBB[0] = 13 Then
If ZRET = 0 Then
ZRET = 1
Continue
Else
Exit For
End If
End If
If ZRET = 1 Then Exit For
Exit Do
Loop
Next Z1
If Z1 = 0 Then
Exit Function
Else If Z1 <= 99 Then
ZFIHILL = ZFIHILL + ZSTLBYT(ZADD,Z1)
Exit Function
Else
ZFIHILL = ZFIHILL + ZADD
End If
Loop
End Function >処理内で ZHDL=ZHDL-1 となってますが、詳しく調べてませんが決まり事のようです。
ActiveBasicの配列の仕様とN88日本語BASICのOPENの仕様を考えた時に、
1を引いたほうが効率よくメモリに格納できるためだと思います。
ちなみにString型変数の限界の長さは環境によって異なります。取得する方法は知りませんが。
少し古い記事ですが、 http://www.activebasic.com/forum/viewtopic.php?t=214 に別解が載ってたりします。
ところでコロンやら無理な圧縮やらで読みにくいので、内容を変更せずに見やすくしてみました。[hide]変数や関数名が全部大文字だと読みにくいのは私だけでしょうか?[code]''''' FileHandleInputLine ファイル・ハンドル・読込み・行 Function ZFIHILL(ZHDL As Long) As String Dim ZADD As String,ZBBB[1] As Byte,ZGET As DWord,ZRET As Long,Z1 As Long ZHDL = ZHDL - 1 SetFilePointer(_System_hFile[ZHDL],-1,0,FILE_CURRENT) ZFIHILL = "" ZADD = ZeroString(100) ZRET = 0 Do For Z1 = 0 To 99 Do ReadFile(_System_hFile[ZHDL],ZBBB,1,VarPtr(ZGET),ByVal 0) ZADD[Z1] = ZBBB[0] If ZGET = 0 Then Exit For If ZBBB[0] = 10 Then SetFilePointer(_System_hFile[ZHDL],1,0,FILE_CURRENT) Exit For Else If ZBBB[0] = 13 Then If ZRET = 0 Then ZRET = 1 Continue Else Exit For End If End If If ZRET = 1 Then Exit For Exit Do Loop Next Z1 If Z1 = 0 Then Exit Function Else If Z1 <= 99 Then ZFIHILL = ZFIHILL + ZSTLBYT(ZADD,Z1) Exit Function Else ZFIHILL = ZFIHILL + ZADD End If Loop End Function[/code][/hide]>処理内で ZHDL=ZHDL-1 となってますが、詳しく調べてませんが決まり事のようです。 ActiveBasicの配列の仕様とN88日本語BASICのOPENの仕様を考えた時に、 1を引いたほうが効率よくメモリに格納できるためだと思います。 ちなみにString型変数の限界の長さは環境によって異なります。取得する方法は知りませんが。
|
|
|
投稿記事 |
Posted: 2008年4月11日(金) 20:50 |
|
|
|
|
|
ZHDLハンドルからCRまたはLFまたはCR+LFを終端とする1行を読込みます。
カンマやタブやスペースは行の終端としません。
旧BASICでの LineInput# と同等な感じのルーチンです。
コード: ''''' FileHandleInputLine ファイル・ハンドル・読込み・行
Function ZFIHILL(ZHDL as Long) as String
Dim ZADD as String , ZBBB[1] as Byte , ZGET as Dword , ZRET as Long , Z1 as Long
ZHDL=ZHDL-1 : SetFilePointer(_System_hFile[ZHDL],-1,0,FILE_CURRENT) : ZFIHILL="" : ZADD=ZeroString(100) : ZRET=0
Do
For Z1=0 to 99
Do : ReadFile(_System_hFile[ZHDL],ZBBB,1,VarPtr(ZGET),ByVal 0) : ZADD[Z1]=ZBBB[0] : If ZGET=0 then Exit For
If ZBBB[0]=10 then SetFilePointer(_System_hFile[ZHDL],1,0,FILE_CURRENT) : Exit For
If ZBBB[0]=13 then If ZRET=0 then ZRET=1 : Continue else Exit For
If ZRET=1 then Exit For
Exit Do : Loop
Next Z1 : If Z1=0 then Exit Function else If Z1<=99 then ZFIHILL=ZFIHILL+ZSTLBYT(ZADD,Z1) : Exit Function else ZFIHILL=ZFIHILL+ZADD
Loop
End Function
ZFIHILL戻値
ファイルハンドルから読込まれた1行の文字列です。
CRやLFは含みません。
処理開始時のポインタから取得を開始します。前方のチェックはしません。
長さの限界はString変数の限界と同等だと思います。(詳しく調べてません。ごめんなさい。その対応も考慮されてません。)
ZHDLハンドル
Open等で使用したハンドル番号です。
処理内で ZHDL=ZHDL-1 となってますが、詳しく調べてませんが決まり事のようです。
他に方法があるかも知れませんが、探せなかったので作りました。
最終行のCR無しやLF無しにも対応しました。
ZHDLハンドルからCRまたはLFまたはCR+LFを終端とする1行を読込みます。 カンマやタブやスペースは行の終端としません。 旧BASICでの LineInput# と同等な感じのルーチンです。 [code]''''' FileHandleInputLine ファイル・ハンドル・読込み・行 Function ZFIHILL(ZHDL as Long) as String Dim ZADD as String , ZBBB[1] as Byte , ZGET as Dword , ZRET as Long , Z1 as Long ZHDL=ZHDL-1 : SetFilePointer(_System_hFile[ZHDL],-1,0,FILE_CURRENT) : ZFIHILL="" : ZADD=ZeroString(100) : ZRET=0 Do For Z1=0 to 99 Do : ReadFile(_System_hFile[ZHDL],ZBBB,1,VarPtr(ZGET),ByVal 0) : ZADD[Z1]=ZBBB[0] : If ZGET=0 then Exit For If ZBBB[0]=10 then SetFilePointer(_System_hFile[ZHDL],1,0,FILE_CURRENT) : Exit For If ZBBB[0]=13 then If ZRET=0 then ZRET=1 : Continue else Exit For If ZRET=1 then Exit For Exit Do : Loop Next Z1 : If Z1=0 then Exit Function else If Z1<=99 then ZFIHILL=ZFIHILL+ZSTLBYT(ZADD,Z1) : Exit Function else ZFIHILL=ZFIHILL+ZADD Loop End Function[/code] ZFIHILL戻値 ファイルハンドルから読込まれた1行の文字列です。 CRやLFは含みません。 処理開始時のポインタから取得を開始します。前方のチェックはしません。 長さの限界はString変数の限界と同等だと思います。(詳しく調べてません。ごめんなさい。その対応も考慮されてません。)
ZHDLハンドル Open等で使用したハンドル番号です。 処理内で ZHDL=ZHDL-1 となってますが、詳しく調べてませんが決まり事のようです。
他に方法があるかも知れませんが、探せなかったので作りました。 最終行のCR無しやLF無しにも対応しました。
|
|
|
投稿記事 |
Posted: 2008年4月11日(金) 14:02 |
|
|
|
|