- PR -

構造体に固定長文字列を用いた配列を用いた場合FileGetでエラー

1
投稿者投稿内容
パトリシア
会議室デビュー日: 2006/10/17
投稿数: 5
投稿日時: 2006-10-17 12:02
VisualStudio.Net 2003 VB.Netで開発しております。
固定長ファイルのテキストデータに対し、固定長文字列の配列を構造体に用いて、
ファイルの読み書きを行おうとしているのですが、
「レコード長が正しくありません」のエラーになってしまいます。

以下のサンプルソースを参照して下さい。
--------------------------------------------------------------------------------
1 Public Structure SAMPLE_STRUST '固定長文字列の構造体を宣言
2 <VBFixedString(6)> Dim strDat1 as string
3 <VBFixedArrayAttribute(2), VBFixedString(4)> Dim StrArray() As String
4 '''VBFixedString(4) StrArray1 as string '←配列にしないとデータ取得可能
5 '''VBFixedString(4) StrArray2 as string '←配列にしないとデータ取得可能
6 Public Sub Init()
7 ReDim KKomoku(2)
8 End Sub
9 End Structure
10public SampleData as SAMPLE_STRUST
11
12Public Function GetFileData(ByVal FilePath as string, _
13        ByVal BufLen as Integer) as Boolean
15
14 Dim tmpFileNo as Long
16 Dim tmpVal As ValueType
17 Dim checkLength1 as Short
18 Dim checkLength2 as Short
19 tmpFileNo = FreeFile()
20 GetFileData = False
21 SampleData.Init() '配列の要素(=2)を定義
22 Try
23 FileOpen(tmpFileNo , FilePath, OpenMode.Random, _
24 OpenAccess.ReadWrite, OpenShare.LockWrite, pBufLen)
25 tmpVal = SampleData
26 checkLength1 = Len(SampleData)
27 checkLength2 = Len(tmpVal)
28
29 FileGet(pFileNum(jFileType), tmpVal)
30 SampleData = CType(tmpVal, SAMPLE_STRUST)
31 GetFileData = True
32 Catch err As IO.IOException
33 MsgBox("【 File I/O Error 】" & vbCr & _
34 err.Message,MsgBoxStyle.OKOnly)
35  End Try
37
36End Function
-------------------------------------------------------------------------------
4、5行目(コメントアウトしている部分)のように個別に宣言している場合は、
正常にデータがセットされます。
3行目のように配列を宣言すると、エラーになってしまいます。
属性の設定の方法に問題があるのでしょうか?
ちなみに、ビルドは正常に完了し、FileOpenは正常に行えているようです。
解決方法をご存知の方また、同じ内容でお悩みの方がおられましたら、
情報をお寄せ下さい。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-10-17 12:46
こちらは参考になりませんか?
(見当違いでしたらすいません)

VB.NETで文字列の構造体をバイト配列へコピーする方法

_________________
--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-17 12:47 ]

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-17 14:29 ]

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-17 14:30 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-10-17 13:12
引用:

3 <VBFixedArrayAttribute(2), VBFixedString(4)> Dim StrArray() As String
4 '''VBFixedString(4) StrArray1 as string '←配列にしないとデータ取得可能
5 '''VBFixedString(4) StrArray2 as string '←配列にしないとデータ取得可能


項目が2つなら、VBFixedArrayAttribute(1)じゃないかにゃぁ。
パトリシア
会議室デビュー日: 2006/10/17
投稿数: 5
投稿日時: 2006-10-17 13:27
引用:

まどかさんの書き込み (2006-10-17 13:12) より:
引用:

3 <VBFixedArrayAttribute(2), VBFixedString(4)> Dim StrArray() As String
4 '''VBFixedString(4) StrArray1 as string '←配列にしないとデータ取得可能
5 '''VBFixedString(4) StrArray2 as string '←配列にしないとデータ取得可能


項目が2つなら、VBFixedArrayAttribute(1)じゃないかにゃぁ。


確かに、おっしゃる通りです。サンプルコードを記述する際に間違ってました。
正しくは
3 <VBFixedArrayAttribute(1), VBFixedString(4)> Dim StrArray() As String
・・・
7 ReDim KKomoku(1)
・・・
です。
パトリシア
会議室デビュー日: 2006/10/17
投稿数: 5
投稿日時: 2006-10-17 13:45
引用:

HIROさんの書き込み (2006-10-17 12:46) より:
こちらは参考になりませんか?
(見当違いでしたらすいません)

VB.NETで文字列の構造体をバイト配列へコピーする方法

_________________
--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-17 12:47 ]



ご教授ありがとうございます。早速参照させていただきました。
お教えいただいたURLにも記載があったように、文字列と文字配列とは異なるため、
実現したい事とは、また方向が異なるかと思います。
恐らくは、文字列変換処理をかませれば、実現できると思いますが、
あくまでシンプルに、「テキストデータ」をVB.Netで構造体における
固定長文字列の配列を用いたI/O制御ができないか模索しているところです。
ともあれ、アドバイスありがとうございます。
パトリシア
会議室デビュー日: 2006/10/17
投稿数: 5
投稿日時: 2006-10-17 13:49
引用:

パトリシアさんの書き込み (2006-10-17 13:27) より:
引用:

まどかさんの書き込み (2006-10-17 13:12) より:
引用:

3 <VBFixedArrayAttribute(2), VBFixedString(4)> Dim StrArray() As String
4 '''VBFixedString(4) StrArray1 as string '←配列にしないとデータ取得可能
5 '''VBFixedString(4) StrArray2 as string '←配列にしないとデータ取得可能


項目が2つなら、VBFixedArrayAttribute(1)じゃないかにゃぁ。


確かに、おっしゃる通りです。サンプルコードを記述する際に間違ってました。
正しくは
3 <VBFixedArrayAttribute(1), VBFixedString(4)> Dim StrArray() As String
・・・
7 ReDim KKomoku(1)
・・・
です。


すみません、誤りを発見いたしました。
訂正します。(サンプルコード 7行目)
誤:7 ReDim KKomoku(1)
正:7 ReDim StrArray(1)


パトリシア
会議室デビュー日: 2006/10/17
投稿数: 5
投稿日時: 2006-10-17 13:54
引用:

パトリシアさんの書き込み (2006-10-17 12:02) より:
VisualStudio.Net 2003 VB.Netで開発しております。
固定長ファイルのテキストデータに対し、固定長文字列の配列を構造体に用いて、
ファイルの読み書きを行おうとしているのですが、
「レコード長が正しくありません」のエラーになってしまいます。

以下のサンプルソースを参照して下さい。
--------------------------------------------------------------------------------
1 Public Structure SAMPLE_STRUST '固定長文字列の構造体を宣言
2 <VBFixedString(6)> Dim strDat1 as string
3 <VBFixedArrayAttribute(1), VBFixedString(4)> Dim StrArray() As String
4 '''VBFixedString(4) StrArray1 as string '←配列にしないとデータ取得可能
5 '''VBFixedString(4) StrArray2 as string '←配列にしないとデータ取得可能
6 Public Sub Init()
7 ReDim StrArray(1)
8 End Sub
9 End Structure
10public SampleData as SAMPLE_STRUST
11
12Public Function GetFileData(ByVal FilePath as string, _
13        ByVal BufLen as Integer) as Boolean
15
14 Dim tmpFileNo as Long
16 Dim tmpVal As ValueType
17 Dim checkLength1 as Short
18 Dim checkLength2 as Short
19 tmpFileNo = FreeFile()
20 GetFileData = False
21 SampleData.Init() '配列の要素(=2)を定義
22 Try
23 FileOpen(tmpFileNo , FilePath, OpenMode.Random, _
24 OpenAccess.ReadWrite, OpenShare.LockWrite, pBufLen)
25 tmpVal = SampleData
26 checkLength1 = Len(SampleData)
27 checkLength2 = Len(tmpVal)
28
29 FileGet(pFileNum(jFileType), tmpVal)
30 SampleData = CType(tmpVal, SAMPLE_STRUST)
31 GetFileData = True
32 Catch err As IO.IOException
33 MsgBox("【 File I/O Error 】" & vbCr & _
34 err.Message,MsgBoxStyle.OKOnly)
35  End Try
37
36End Function
-------------------------------------------------------------------------------
4、5行目(コメントアウトしている部分)のように個別に宣言している場合は、
正常にデータがセットされます。
3行目のように配列を宣言すると、エラーになってしまいます。
属性の設定の方法に問題があるのでしょうか?
ちなみに、ビルドは正常に完了し、FileOpenは正常に行えているようです。
解決方法をご存知の方また、同じ内容でお悩みの方がおられましたら、
情報をお寄せ下さい。



【補足】
1.エラーは29行目のFileGetを実行したところでChatchされます。
2.構造体のLengthについて
  26 checkLength1 = Len(SampleData)
  27 checkLength2 = Len(tmpVal)
  26、27行目で構造体のLengthをチェックしていますが、
  配列を用いた場合でも、個別に持った場合でも同じ長さ(6+4+4=14)が帰って
  来る事は確認で来ています。
ださいくろう
常連さん
会議室デビュー日: 2006/10/17
投稿数: 46
お住まい・勤務地: 豊田市
投稿日時: 2006-10-17 20:55
マルチポストはやめたほうがいいですよ。
1

スキルアップ/キャリアアップ(JOB@IT)