by まけイヌ » 2005年7月19日(火) 21:37
> バイナリデータがうまく読み込めません。
> 読み込めるのはテキストデータだけでしょうか?
Inputの仕様は連続するNULLターミネートされた文字列も条件です。
つまり、
・カンマ
・改行
・NULL
のいずれかにヒットすると読み込みをやめてしまいます。
恐らくBingoMan様のソースにイグトランス様の改良を加えたバージョンが
一番正確にバイナリデータの確保を行えると思います。
<<蛇足>>
このソースでも4GB以上のファイルは正常に読み込めません。
符号無し型のDWord型を使うので4GB = 0Byteとなってしまいます。
これを有効にするには、GetFileSize関数(API)の第2引数の0に
きちんと0で初期化されたDWord型変数を与えてやり、
関数実行後にこの変数を評価する必要があります。
コードにするとこんな感じです。
コード: 全て選択
'■ファイル内バッファを取り込む
Function fload ( ByVal lpstrFileName As BytePtr) As BytePtr
Dim hFile As HFILE
Dim dwSizeOver As DWord
Dim dwSizeLower As DWord
Dim qwSize As QWord
fload = NULL
hFile = CreateFile( lpstrFileName, GENERIC_READ, 0,ByVal 0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0)
If hFile = INVALID_HANDLE_VALUE Then Exit Function
dwSizeOver = 0
dwSizeLower = GetFileSize( hFile, VarPtr(dwSizeOver))
If dwSizeOver = 0 Then
qwSize = dwSizeLower
Else
qwSize = (dwSizeOver * &h100000000) + dwSizeLower
End If
fload = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, qwSize)
ReadFile( hFile, fload, qwSize, VarPtr(dwSizeOver), ByVal 0)
CloseHandle (hFile)
End Function
'■バッファを開放する
Function fclose ( ByVal lpstrBuffer As BytePtr) As Long
fclose = HeapFree( GetProcessHeap(), 0, lpstrBuffer)
End Function
'■--- ここからが実装部 ---
Dim buf As BytePtr
'■バッファ取り込み
buf = fload("sample.txt")
'--- ここでファイル内バッファに対する処理を書きます ---
'■取り込んだバッファの開放
fclose (buf)
'■終了
End
ただし、HeapAlloc関数(API)やReadFile関数(API)のところでDWord型になっているので、正しくロードできるかどうかは疑問ですが..
※つか、たぶんできません(^^;;;
※このコード自体は4GBまでは正常動作します
> バイナリデータがうまく読み込めません。
> 読み込めるのはテキストデータだけでしょうか?
Inputの仕様は連続するNULLターミネートされた文字列も条件です。
つまり、
・カンマ
・改行
・NULL
のいずれかにヒットすると読み込みをやめてしまいます。
恐らくBingoMan様のソースにイグトランス様の改良を加えたバージョンが
一番正確にバイナリデータの確保を行えると思います。
<<蛇足>>
このソースでも4GB以上のファイルは正常に読み込めません。
符号無し型のDWord型を使うので4GB = 0Byteとなってしまいます。
これを有効にするには、GetFileSize関数(API)の第2引数の0に
きちんと0で初期化されたDWord型変数を与えてやり、
関数実行後にこの変数を評価する必要があります。
コードにするとこんな感じです。
[code]
'■ファイル内バッファを取り込む
Function fload ( ByVal lpstrFileName As BytePtr) As BytePtr
Dim hFile As HFILE
Dim dwSizeOver As DWord
Dim dwSizeLower As DWord
Dim qwSize As QWord
fload = NULL
hFile = CreateFile( lpstrFileName, GENERIC_READ, 0,ByVal 0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0)
If hFile = INVALID_HANDLE_VALUE Then Exit Function
dwSizeOver = 0
dwSizeLower = GetFileSize( hFile, VarPtr(dwSizeOver))
If dwSizeOver = 0 Then
qwSize = dwSizeLower
Else
qwSize = (dwSizeOver * &h100000000) + dwSizeLower
End If
fload = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, qwSize)
ReadFile( hFile, fload, qwSize, VarPtr(dwSizeOver), ByVal 0)
CloseHandle (hFile)
End Function
'■バッファを開放する
Function fclose ( ByVal lpstrBuffer As BytePtr) As Long
fclose = HeapFree( GetProcessHeap(), 0, lpstrBuffer)
End Function
'■--- ここからが実装部 ---
Dim buf As BytePtr
'■バッファ取り込み
buf = fload("sample.txt")
'--- ここでファイル内バッファに対する処理を書きます ---
'■取り込んだバッファの開放
fclose (buf)
'■終了
End
[/code]
ただし、HeapAlloc関数(API)やReadFile関数(API)のところでDWord型になっているので、正しくロードできるかどうかは疑問ですが..
※つか、たぶんできません(^^;;;
※このコード自体は4GBまでは正常動作します