• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体をランダムファイルに書き込みたいのですが)

構造体をランダムファイルに書き込む処理でエラーが発生する

vbhanatyanの回答

回答No.2

>ファイル登録時に >FileOpen(iFileNo, sFileName, OpenMode.Random, , , len(wData)) >FileOut(iFileNo, wData, iRecord) >上記のFilePutを実行した時点で、 FileOut になっていますが? FileGet や wData への書き込みはどこでしているのですか? VB6.0 でも書き込みは、Get 、Put していたはずですが。

okada0504
質問者

補足

回答ありがとうございます。 FileOut=>FikePut すみません。間違いです。

関連するQ&A

  • VB.NETにて、構造体へデータをセットするにはどうすればよいですか?

    バイナリーファイルから読み込んだデータを構造体にセットするにはどのようにすればよいですか? ご教授よろしくお願いします。 ファイルサイズは構造体のサイズと同じく300byteです。 Public Structure ST1 <VBFixedString(10), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=10)> _ Public str1() As String <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> _ Public str2() As String <VBFixedString(30), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=30)> _ Public str3() As String Public Sub Initialize() ReDim str1(4) ReDim str2(4) ReDim str3(4) End Sub End Structure 処理 Private Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn1.Click dim ST as new ST1 ST.Initialize() FileOpen(1, OpenFileDialog1.FileName, OpenMode.Binary, OpenAccess.Read, OpenShare.Default)) FileGet(1, ST) FileClose(1) End Sub ここでわからないのが、イニシャライズを行い、配列数を設定しても、ファイルから読み込んでくるバイト数は配列でないときと同じサイズ(60byte)で読み込んできてしまいます。 STをイニシャライズしても、Marshal.SizeOf(ST)の値が変わらないのが原因だと思うのですが、宣言の仕方がおかしいのでしょうか? ご教授お願いいたします。

  • ファイル入力のデータを構造体に入れる方法

    VB.net(XP:VS2008のみフルインストール)にて テキストファイルから入力したデータを構造体st_testに入れたいと考えているのですが、実現できません。 どなたか、お力添えをお願いします。 テキストファイルは、事前に構造体(st_test)に値を入れ、 単純にFileOpen→OutPutしています。 (","や" "などでメンバ毎に分割等はしておりません。) 構造体 ---------------------- Public Structure st_test <VBFixedArray(63), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim A() As Byte Dim B As Integer <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Dim N() As Byte <VBFixedArray((7), (11)), MarshalAs(UnmanagedType.ByValArray, SizeConst:=(72))> _ Dim S(,) As Byte <VBFixedArray(11), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _ Dim U() As Integer End Structure ---------------------- 実現しようとしている個所 ---------------------- Dim t As String Dim temp(2) as st_test FileOpen(1, "test1.txt", OpenMode.Input) Input(FileNum, t) '''temp(0) = CType(CType(t, Object), st_test)...? temp(0) = CType(t, st_test) | FileOpen(1, "test2.txt", OpenMode.Input) Input(FileNum, t) temp(1) = CType(t, st_test) ---------------------- 上記の様に処理を行えば簡単にできるのかと安易な発想でいましたが、 CTypeの処理で'String'の値を'st_test'に変換できません。 旨のエラーになり、うまく実現することができません。 そもそもString型のデータをst_testにキャストすることが不可能なのでしょうか? それともただ、実現方法がカスなのでしょうか? 実際の構造体のサイズは4000Byteを超え(メンバ数も多いです。。。) 一つ一つ入力していくことが現実的に不可能なため ファイルよりInputすることしか思いついておりません。 test1.txtの中身を秀丸で開いてみました。 参考になれば・・・。 改行はなく、"福岡"の後等にそれぞれ空白があります。 -------------------------- 福岡 . A1 14 15 16 17 18 19 XX XX XX XX XX XX -------------------------- 宜しくお願いします。

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • 定数を構造体で・・・

    こんにちわ。 ちょっと疑問に思いまして、お聞きしたいのですが。 VB.net2005を使用しています。 定数宣言を構造体で宣言するのは 考え方として変でしょうか? たとえば public structure TEST   public dmy as byte '←エラー解除のダミー   public const CNUM as integer = 1 end structure public sub testM()   Lbl1.Text = TEST.CNUM end sub のように作り 定数宣言が多くあった場合に いちいちページ切り替え等をしなくても TEST.と打った後にすぐに一覧がでてくるので 便利だと思ったのですが。 この考え方はやっぱりへんなんですかね? もともとC言語出身なもので、 色々試していて疑問におもったのです。 もっとほかによい方法あるよ!ってのが あればお教えください。 お暇なときでよいので回答お願い致します^^   

  • VB.NET2013多次元構造体の初期化について

    Visual Studio2013 VB.NETを始めたばかりです 多次元構造体の初期化で困ってました 内容的には Public Structure ST1 Public a1 As Boolean Public a2 As Integer <VBFixedArray((9), (2)), MarshalAs(UnmanagedType.ByValArray, sizeconst:=30)> _ Public a3(,) As Long Public Sub Initialize() ReDim a3(9, 2) End Sub End Structure Public ss1(0) as ST! Public Sub test() ss1.Initialize() ss1(0).a3(0,0)=0 この状態では、多次元配列は確保されなくNothingで 初期化できない、参照型であると言うのが分かり 色々と調べてみてやっと、 コピーコンストラクタを用意して複製する方法で出来るのが分かりました Public Sub New(ByVal ss As ST1) MyClass.a1 = ss.a1 MyClass.a2 = ss.a2 MyClass.a3 = DirectCast(ss.a3.Clone(), Long(,)) End Sub End Structure Public Sub test() Dim ss0 As ST1 ss0.a1 = True ss0.a2 = 1 ss0.a3 = New Longr(,) {・・・・} Dim ss1(0) As New ss0 ただa3のサイズが大きいため定義するのは大変なので Dim bb(9,2) As Long ss0.a3 = bb としても上手く初期化できるのが分かり そしてステップ実行で中を確認していると あれっと思い 「コピーコンストラクタを用意して複製」 の方法ではなく元のまま Public Sub test() Dim bb(9,2) As Long ss1.Initialize() ss1(0).a3=bb とすると、上手く初期化され ss1(0).a3(0,1) = 100 と処理できるようになりました ただ、これで本当にいいのかが分かりません よろしくお願いします

  • ファイルの存在の確認をする方法

    こんにちは。 VB.netでプログラミングしているんですが、ファイル処理について質問があります。ファイルを保存する際に、よく「すでにファイルが存在します。上書きしますか?」と聞いてきますよね。これを実現するにはどんな方法があるでしょうか?ただし、コモンダイアログは使いません。FileOpen、FileCloseで実現したいのです。 以下のプログラムをどのように変えたらいいでしょうか?ご教授お願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   FileOpen(1, Format(Now, "yyyyMMdd") & " .txt", OpenMode.Output)   PrintLine(1, "test")   FileClose(1) End Sub

  • VB2005のファイル読込でDo While Not EOFを使用するには?

    いつもお世話になります。VB2005でテキストファイル(中身は1レコードのみ)をFileOpen関数の ランダムアクセスを使用し、FileGet関数で値を取得しました。しかし、取得後に続くDo While Not EOF~LOOP内の 処理が実行されません。同じファイルでVB6版で使用したら問題なく実行されたのですが。 どのように対応したらよろしいのでしょうか? よろしくお願い致します。 ソース Structure TypeUkeData '(Length = 100) <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeDate() As Byte  '受付日 <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Dim b_UkeTime() As Byte   '受付時刻 <VBFixedArray(3), MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim b_UkeCnt() As Byte '件数 <VBFixedArray(79), MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Dim b_UkeNaiyo() As Byte '内容 Public Sub Initialize() ReDim b_UkeDate(7) ReDim b_UkeTime(7) ReDim b_UkeCnt(3) ReDim b_UkeNaiyo(79) End Sub End Structure Sub ReadFile Dim b_UkeData As TypeUkeData Dim i_FileNo As Short Dim i_RecNo As Short call b_UkeData.Initialize() i_FileNo = FreeFile() FileOpen(i_FileNo, "C:\UkeData.tmp", OpenMode.Random, , , 100) ' 最初のレコードを読み込む i_RecNo = 1 FileGet(i_FileNo, b_UkeData, i_RecNo) ←b_UkeDataに確かに値は入っている Do While Not EOF(i_FileNo)  ←ループ内の処理に一度も入らず次のFileCloseにいってしまう CALL SubSpilit(b_UkeData) ' 次のレコードを読み込む i_RecNo = i_RecNo + 1 FileGet(i_FileNo, b_UkeData, i_RecNo) Loop FileClose(i_FileNo) End Sub

  • 構造体配列

    こんにちわ。VB.NET初心者です。伝授お願いします。 VB6では Type Tpn_Index IdxSu As Integer idx(MAXTPN-1) As Integer End Type と定義できますが、VB.netでは構造体の中の配列部分が定義できません。 どのように書けばよろしいでしょうか? Public Structure Tpn_Index Dim IdxSu As Integer Dim idx() As Integer End Structure 上記の Dim idx() As Integer の部分です 宜しくお願いします

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

  • VBからVCへ渡す構造体の設定について

    VB2005からVCで作られたDLLをコールするときにエラーが出て困ってます。 関数のパラメータに構造体を指定して、構造体のメンバの文字列を渡したいけれど、なんかうまく行かないんですよね。 VB2005だと固定長文字列ってのがサポートされていないとか何とか言うのは分かったけれど、 解決方法が不明となっています。 アドバイスをお願いします。 コードはこんな感じ。 *VC2005******************************************************* typedef struct{  int iTemp;  char cTemp[256]; }tag_strTemp; void __declspec(dllexport) WINAPI TestFunction(tag_strTemp* pstrTemp) {  MessageBox(NULL, pstrTemp->cTemp, "", 0); } *VC2005******************************************************* *VB2005******************************************************* Moduel Module1  Public Structure tag_strTemp   Public iTemp as Integer   Public cTemp as String ←ここの定義に問題があるんだと思ってます。  End Structure End Module Public Class Form1  Private Sub Form1_Load(・・・)   Dim strTemp as tag_strTemp   strTemp.cTemp = "ABCDE"   TestFunction(strTemp)  End Sub End Class *VB2005*******************************************************