by Sinryow » 2005年12月11日(日) 01:46
自分がコードを組んでいる間に,淡幻星さんが先に投稿していました(汗)
ただ,私は手法が異なる(※)ので一応投稿しておきます。
※一度読み込み済みのテキストデータに対して適用する方法です。行に分割した結果を保存しておけるという利点があります。
コードの内容 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#N88BASIC
Dim buf As String ' 行単位に分ける文字列
Dim error As Long ' ファイル読み込みのエラーがあるかどうか
Dim lines As Long ' 行数
Dim linelist As *Long ' 行の開始位置・終了位置のリスト
buf=FileContent("bitmap.abp", error)
If error Then
Print "Error!"
END()
End If
lines=GetLines(buf)
linelist=malloc((lines+1)*SizeOf(Long))
GetLineList(buf, linelist)
Print "行数は", lines
Print "3行目は", Mid0(buf, linelist[2], linelist[3]-linelist[2]-2)
Print "10行目は", Mid0(buf, linelist[9], linelist[10]-linelist[9]-2)
free(linelist)
' 行数の取得
Function GetLines(s As String) As Long
Dim slen As Long ' 文字列の長さ
Dim i As Long
slen=Len(s)
GetLines=1
' \r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s=10 Then
GetLines=GetLines+1
End If
Next
End Function
' 行のリストの取得(行数+1の数だけのLong型配列を準備して下さい)
Sub GetLineList(s As String, linelist As *Long)
Dim slen As Long ' 文字列の長さ
Dim i As Long, p As Long
slen=Len(s)
linelist[0]=1
p=1
' ヌル文字に達するまで,\r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s=10 Then
linelist[p]=i+2
p=p+1
End If
Next
linelist[p]=slen+2
End Sub
' ファイルの読み込み
Function FileContent(fname As String)(ByRef error As Long) As String
Dim hF As Long, fLen As Long, fLen2 As DWord, dummy As DWord
hF=CreateFile(fname, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hF=INVALID_HANDLE_VALUE Then
FileContent=""
If VarPtr(error)<>0 Then error=-1
Else
fLen=GetFileSize(hF,VarPtr(fLen2))
If fLen2>0 Then fLen=&H7FFFFFFF
FileContent=ZeroString(fLen+1)
ReadFile(hF, FileContent, fLen, VarPtr(dummy), ByVal 0)
If dummy<>fLen And VarPtr(error)<>0 Then error=1
CloseHandle(hF)
End If
End Function
' Mid$関数の改造版:第3引数が0以下の場合は空の文字列を返す
Function Mid0(buf As String, StartPos As Long, ReadLength As Long) As String
Dim length As Long
StartPos=StartPos-1
If StartPos<0 Then
'error
'Debug
Exit Function
End If
length=Len(buf)
If length<=StartPos Then Exit Function
If ReadLength<=0 Then Exit Function
If ReadLength>length-StartPos Then
ReadLength=length-StartPos
End If
Mid0=ZeroString(ReadLength)
memcpy(Mid0,StrPtr(buf)+StartPos,ReadLength)
End Function
※空の行を選ぶと(Mid$の第3引数が0になると)バグります。(汗)
今日はもう時間がないので近いうち修正します。
→2005.12.11 10:24修正済。
※2005.12.11 17:16再修正。
自分がコードを組んでいる間に,淡幻星さんが先に投稿していました(汗)
ただ,私は手法が異なる(※)ので一応投稿しておきます。
※一度読み込み済みのテキストデータに対して適用する方法です。行に分割した結果を保存しておけるという利点があります。
[hide=コードの内容][code]#N88BASIC
Dim buf As String ' 行単位に分ける文字列
Dim error As Long ' ファイル読み込みのエラーがあるかどうか
Dim lines As Long ' 行数
Dim linelist As *Long ' 行の開始位置・終了位置のリスト
buf=FileContent("bitmap.abp", error)
If error Then
Print "Error!"
END()
End If
lines=GetLines(buf)
linelist=malloc((lines+1)*SizeOf(Long))
GetLineList(buf, linelist)
Print "行数は", lines
Print "3行目は", Mid0(buf, linelist[2], linelist[3]-linelist[2]-2)
Print "10行目は", Mid0(buf, linelist[9], linelist[10]-linelist[9]-2)
free(linelist)
' 行数の取得
Function GetLines(s As String) As Long
Dim slen As Long ' 文字列の長さ
Dim i As Long
slen=Len(s)
GetLines=1
' \r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s[i]=10 Then
GetLines=GetLines+1
End If
Next
End Function
' 行のリストの取得(行数+1の数だけのLong型配列を準備して下さい)
Sub GetLineList(s As String, linelist As *Long)
Dim slen As Long ' 文字列の長さ
Dim i As Long, p As Long
slen=Len(s)
linelist[0]=1
p=1
' ヌル文字に達するまで,\r(13)と\n(10)が連続している部分を検索する
For i=1 To slen-1
If s[i-1]=13 And s[i]=10 Then
linelist[p]=i+2
p=p+1
End If
Next
linelist[p]=slen+2
End Sub
' ファイルの読み込み
Function FileContent(fname As String)(ByRef error As Long) As String
Dim hF As Long, fLen As Long, fLen2 As DWord, dummy As DWord
hF=CreateFile(fname, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hF=INVALID_HANDLE_VALUE Then
FileContent=""
If VarPtr(error)<>0 Then error=-1
Else
fLen=GetFileSize(hF,VarPtr(fLen2))
If fLen2>0 Then fLen=&H7FFFFFFF
FileContent=ZeroString(fLen+1)
ReadFile(hF, FileContent, fLen, VarPtr(dummy), ByVal 0)
If dummy<>fLen And VarPtr(error)<>0 Then error=1
CloseHandle(hF)
End If
End Function
' Mid$関数の改造版:第3引数が0以下の場合は空の文字列を返す
Function Mid0(buf As String, StartPos As Long, ReadLength As Long) As String
Dim length As Long
StartPos=StartPos-1
If StartPos<0 Then
'error
'Debug
Exit Function
End If
length=Len(buf)
If length<=StartPos Then Exit Function
If ReadLength<=0 Then Exit Function
If ReadLength>length-StartPos Then
ReadLength=length-StartPos
End If
Mid0=ZeroString(ReadLength)
memcpy(Mid0,StrPtr(buf)+StartPos,ReadLength)
End Function[/code][/hide]
※空の行を選ぶと(Mid$の第3引数が0になると)バグります。(汗)
今日はもう時間がないので近いうち修正します。
→[b]2005.12.11 10:24修正済。[/b]
※[b]2005.12.11 17:16再修正。[/b]