C#固定長ファイルの取得方法について

このQ&Aのポイント
  • VB6にて作成された固定長ファイルをC#で読み込み、保存する方法を教えてください。
  • VB6のコードを参考にしてC#でFileGetを使用して固定長データを読み込む方法を試していますが、エラーが発生しています。
  • 開発環境はWindows XP SP3とVisual Studio 2010です。
回答を見る
  • ベストアンサー

C# 固定長ファイルの取得 FileGet

VB6にて作成された固定長ファイルをC#で読み込み、保存を行いたいです。 いろいろとサイトを回ってみて、FilePutのサンプルを見つけました。 そちらを元にFilePutをFileGetに変更すればいいのではないかと思ったのですがエラーとなってしまいます。 開発環境 windowsXP SP3 VisualStudio2010 <VB6ソース> -------標準モジュール------------ Type typStrc SaveLong1 As Long SaveInt1 As Integer SaveInt2 As Integer SaveInt3 As Integer End Type Public ABC As typStrc -------------------------------- ------フォーム内----------------- Private Sub Command1_Click() Dim intFNo As Integer Dim RLn_ABC As Integer intFNo = FreeFile(0) RLn_ABC = Len(ABC) Open App.Path & "\Save.dat" For Random As #intFNo Len = RLn_ABC ABC.SaveLong1 = 5000 ABC.SaveInt1 = 100 ABC.SaveInt2 = 200 ABC.SaveInt3 = 300 Put #intFNo, 1, ABC Close #intFNo End Sub ---------------------------------- <C#ソース> 参照設定で「Microsoft.VisualBasic」を追加。 ---------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.VisualBasic; namespace WindowsFormsApplication1 { public partial class Form1 : Form { struct Strc { int SaveLong1; short SaveInt1; short SaveInt2; short SaveInt3; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int FNo = FileSystem.FreeFile(); Strc ABC = new Strc(); FileSystem.FileOpen(FNo, @"C:\\Save.dat", OpenMode.Random, OpenAccess.Default, OpenShare.Default, Strings.Len(ABC)); FileSystem.FileGet(FNo, ABC, 1); FileSystem.FileClose(FNo); } } } ---------------------------------- 「FileGet」のところで実行前のVisualStudio上でエラーとなってしまいます。 固定長データの読み込み方法についてお教え頂けませんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

FileGetのどのオーバーロード使うかを明示しないといけないでしょう 今回の場合 FileGet(Int32, ValueType, Int64 ) を使うようにしないといけませんので // ValueTypeとstruct Strucを関連付ける ValueType val = ABC; FileSystem.FileOpen(FNo, @"C:\\Save.dat", OpenMode.Random, OpenAccess.Default, OpenShare.Default, Strings.Len(ABC)); FileSystem.FileGet( FNo, ref val, 1 ); FileSystem.Close( FNo ); // 読み込んだデータを実体変数にコピー ABC = (Struc)val; といった具合でしょう

DotNetStudy
質問者

お礼

ご回答頂きありがとうございます。 なるほど、どのオーバーロードを使うかはこのように指定するのですね。 大変勉強になりました。 ValueTypeというのがちょっとまだ理解できていないので勉強してみます。 すごく勉強になりました。ありがとうございます。

関連するQ&A

  • テキストファイルを読み込んで文字の動的表示をする方法を教えてください。

    Visual basic2005 Express Editionで、文字を動的に表示する方法は、 TextBoxとTimerをFormに貼り付けて、Timerのプロパティの動作の項目のEnabledをTrueにしてコードに Public Class Form1 Private hyouji As String = "テスト" Private nagasa As Integer = 0 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick TextBox1.Text = Microsoft.VisualBasic.Left(hyouji, nagasa) nagasa += 1 If nagasa > Len(hyouji) Then nagasa = 0 End If End Sub End Class と入力すると出来ますが、テキストファイルを読み込んで文字を動的に表示する方法が分かりません。 教えてください。よろしくお願いします。

  • VB2008 2バイト文字の化け字は当然! Yes or No?

    Function FileGetChar(ByVal f As String, ByVal p As Integer) As String   Dim n As Integer = FreeFile()   Dim c As Char = “”   If File.Exists(f) Then     FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)     Seek(n, p)     If Not EOF(n) Then       FileGet(n, c)     End If     FileClose(n)   End If   Return c End Function このようにSeek関数とFileGet関数を利用する限りでは2バイト文字の化け字は避けられない! 一体、この私の判断は正しいのでしょうか? VB2008 Express Edition

  • VSC#Epressで、FormのShowsに

    お世話になります。 VisualStudioC#2010Expressにて、フォーム(A)を作成し、 そのフォーム(A)にShownイベントを取り付けます。 そして、そのフォームを継承したフォーム(B)を作ります。 すると、そのフォーム(B)のみ、実行時だけではなく、 VisualStudioでフォームのデザイン時に そのフォームを開くと、VisualStudio内でもShownイベントが発生してしまいます。 (A)のフォームでは、この現象は起こりません。 下記のように、表示時に閉じるか否かの分岐をしておくと、 デザイナでも開いた瞬間にメッセージボックスが出て閉じてしまい、 二度と編集できなくなってしまいます。 はっきり言って迷惑です。 デザインしている途中でイベントが発生しないようにするには、 どうすればよいでしょうか。 よろしくお願いいたします。 フォーム(A) 継承元 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string a = null; public Form1() { InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { if (a == null) { MessageBox.Show("aが設定されていません。"); this.Close(); } } } } フォーム(B) 継承先 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication1 { public class Class1 : Form1 { } }

  • キー入力が反応しません。

    VisualStudio2005のC#になります。 ボタンを押す ラベルに文章 ボタン消える Enterキー押す ラベルの文章が変わる という処理を行いたいのですが、”Enterキー押す”以下が実行されません。なぜなのでしょうか?どうすれば実行されるのでしょう。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace 消す { public partial class Form1 : Form { private bool EnterKeyDown; public Form1() { InitializeComponent(); } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (EnterKeyDown == false) { EnterKeyDown = true; label1.Text = "押したよ"; } else { EnterKeyDown = false; label1.Text = "押したよ2"; } } private void button1_Click(object sender, EventArgs e) { button1.Visible = false; } } }

  • SendMessageによるチェックボックスの状態取得

    はじめまして、VB.NET2005でチェックボックスの状態の取得、設定をうまく設定できません。OSはxpです。 Public Class Form1 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"  (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Integer Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, _ ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, _ ByVal wMsg As Integer, ByVal wParam As Integer, ByVal iParam As String) As Integer Private Declare Function SendMessageint Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, _ ByVal wMsg As Integer, ByVal wParam As Integer, ByVal iParam As Integer) As Integer Const BM_GETCHECK = &HF0 Const BM_GETSTATE = &HF2 Const BM_SETCHECK = &HF1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim hWindows As Integer Dim ipEDIT As Integer Dim i As Integer hWindows = FindWindow(vbNullString, "Form1") '198458 ipEDIT = FindWindowEx(hWindows, 0, vbNullString, "CheckBox1") MessageBox.Show(ipEDIT) i = SendMessageint(ipEDIT, BM_GETCHECK, 0, 0) 'SendMessageint(ipEDIT, BM_SETCHECK, 1, 0) MessageBox.Show(i) End Sub End Class のようなコードなのですが、 ハンドルは取得できているのですが、 SendMessageの戻り値は0になります。 勿論、コメントのチェックをセットも出来ません。 ご教授のほど宜しくお願いします。

  • EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテ

    EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテキストファイルを作って書き込むというコードを書きましたが、新しく出来たテキストファイルの末尾に、もともとのファイルには無かったスペースが追加されてしまいます。 原因と対策を教えて頂きたいです。 ------------------------------------------------------- Dim FileName1 As String Dim FileName2 As String Dim FileNumber1 As Integer Dim FileNumber2 As Integer Dim Data As String FileName1 = Application.GetOpenFilename("Text Files (*.txt), *.txt") FileName2 = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") Data = Space(FileLen(FileName1)) FileNumber1 = FreeFile Open FileName1 For Binary As #FileNumber1 Get #FileNumber1, , Data Close #FileNumber1 'この間に"Data"内容を処理するコードを入れる予定 FileNumber2 = FreeFile Open FileName2 For Binary As #FileNumber2 Put #FileNumber2, , Data Close #FileNumber2 ------------------------------------------------------- このコードで1284バイトのテキストを読み込ませると末尾にスペースが追加されて1918バイトになってしまいました。 "Data"の内容を表示させてもスペースはなく、Len関数で大きさを調べても1284バイトです。

  • 指定番目の文字を読む込む・・・超初心者

    遅ればせながらVISTAを搭載したノートブックを買って遊び始めました。 VB2008Expressをダウンロードして最初のプロジェクトに挑戦中。 が、情けないことに最初から躓いて立ち往生中です。 <ファイルから指定番目の文字を読む込む関数の作成要領> ' --------------------------- ' FileGetChar VB6.0 Version ' --------------------------- Public Function FileGetChar(ByVal f As String, ByVal r As Long) As String   Dim n As Integer   Dim c As String * 1      n = FreeFile()   Open f For Random As #n Len = 1   Get #n, r, c   Close #n   FileGetChar = c End Function ' ----------------------------- ' FileGetChar VB 2008 Version ' ----------------------------- Public Function FileGetChar(ByVal f As String, ByVal p As Short) As String   Return (GetChar(My.Computer.FileSystem.ReadAllText(f), p)) End Function VB 2008バージョンの問題点は、その都度に全てのテキストを呼び込んでいることです。 質問は、この難点を克服する方法についてです。 MSDNライプラリを読めばとは思いますが・・・。 聞いた方が早いかなと思って質問します。 宜しくお願いします。

  • Word_VBA 拡張子手前までのファイル名の取得

    こんにちは。VBA全般初心者です。Wordに対していくつかの処理後、元ファイルに日付(年月)をつけて別保存というマクロを作ろうとしています。現在下記で作成中ですが、これだと元ファイルの.docxもファイル名として認識されており、ABC.docx → ABC.docx.2023_05.docxと保存されます。 ABC2023_05.docx にしたいです。 Sub ファイル名取得して保存() Dim タイプ As Variant Dim 区切り As String Dim ドット位置 As Integer Dim 日付 As String Dim ファイル名 As String Dim タイトル As String '拡張子を定義 タイプ = ActiveDocument.name 区切り = "." ドット位置 = Len(タイプ) - (InStrRev(タイプ, 区切り)) タイプ = Right(タイプ, ドット位置 + 1) 日付 = Format(Date, "yyyy_mm") タイトル = ActiveDocument ファイル名 = Application.PathSeparator & タイトル & 日付 & タイプ With ActiveDocument .SaveAs FileName:=.Path & ファイル名 End With End Sub

  • テキストファイルへの書き出し

    ExcelVBAについて教えてください。 Dim path As String Dim FullPath As String Path ="C:\" Dim FN As String FN ="abc.txt" Dim intFF As Integer intFF = FreeFile FullPath = Path & "\" & FN Open FullPath For Output As #intFF Print #intFF, FullPath Close #intFF とやると、Open FullPathのところで、実行時エラー 76、パスが見つかりませんと表示されてしまいます。 やりたいことは、Excel VBAでテキストファイルを新規につくり、そこへ書き出し、保存したいです。ファイル名はFullPathで指定したファイル名を新規で作り出し、それに対して書き出し、保存をしたいです。 何が間違っているのでこのようなエラーが表示されてしまうのでしょうか?回避方法がありましたらご教授お願いいたします。

  • VB6.0 改行コードのないファイルの読み込み

    VB6.0で改行コードが無く、半角と全角文字が入り混じっているファイルの読み取り方法を教えて下さい。 通常の一行読み込みの範囲を大幅に超えている文字列です。 他のサイトで以下のようなプログラム(20バイトずつ切り取って読む)を見つけたのですが、 Dim InFileNo As Integer Dim Buf As string * 10 Dim LINE As Long InFileNo = FreeFile Open "C:\test.txt" For Random As #InFileNo Len = 20 LINE = 1 Do Until EOF(InFileNo) Get #InFileNo, LINE, buf LINE = LINE + 1 Loop これだと、半角と全角が混じっている箇所で文字化けを起こしてしまいます。 以上です。よろしくお願い致します。