• 締切済み

[VB] 配列の内容をテキストファイル出力&テキストファイルを配列に入力

現在ひとつプログラムを作っているのですが、流れ的に (1)テキストファイルを読み込み、その内容を配列に読みこむ (2)処理(ランキングのためのソート等) (3)配列の内容をテキストファイルに書き込む という内容にしたいです。 しかしいろいろ試してみたのですが、残念ながらうまく出力されていないのか、2度目に動かしたらエラーがでます。 ご教授お願いいたします。

みんなの回答

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.4

nameいち.Text = rank1(0, 0) nameに.Text = rank1(0, 1) nameさん.Text = rank1(0, 2) nameよん.Text = rank1(0, 3) nameご.Text = rank1(0, 4) いち.Text = rank1(1, 0) に.Text = rank1(1, 1) さん.Text = rank1(1, 2) よん.Text = rank1(1, 3) ご.Text = rank1(1, 4) は提供したロジックでは該当する部分が存在しないですから、当然出ませんよ。 ロジックを作成する際にコントロールを準備するのが手間だったものですから。 そのため、参考までに以下のようなコメントを作成しておきました。 'nameいち.Text = rank(0).name 'いち.Text = rank(0).score このコメントは1位用しかありませんので、5位まで同じようなロジックを記述する必要があります。 例 nameいち.Text = rank(0).name いち.Text = rank(0).score nameに.Text = rank(1).name に.Text = rank(1).score ・・・ といった感じです。 ちょっと工夫してみたいのであれば。 ラベルを配列に格納し設定する方法もあります。 こうしておけば、すべてのラベルに対しての処理をループでかけるようになるため、大きなメリットがあります。 Private NameLabel as New List(Of System.Windows.Forms.Label) Private ScoreLabel as New List(Of System.Windows.Forms.Label) を準備します。 Form_Loadイベントにて NameLabel.Add(nameいち) NameLabel.Add(nameに) NameLabel.Add(nameさん) NameLabel.Add(nameよん) NameLabel.Add(nameご) ScoreLabel.Add(いち) ScoreLabel.Add(に) ScoreLabel.Add(さん) ScoreLabel.Add(よん) ScoreLabel.Add(ご) 次に提供したロジックの 'nameいち.Text = rank(0).name 'いち.Text = rank(0).score としていた部分を For i As Integer = 0 to NameLabel.Count - 1 NameLabel(i) = rank(i).name ScoreLabel(i) = rank(i).score Next i とすれば完了です。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

''' <summary> ''' 格納データのフォーマット ''' </summary> ''' <remarks></remarks> <Serializable()> _ Public Class Ranking Public name As String Public score As Integer End Class はクラスの宣言ですので、Formクラスの外に宣言してください。 記述場所の問題か、コピー時のご認識が問題ですので、 <Serializable()> _ Public Class Ranking Public name As String Public score As Integer End Class をコピペして必要であれば、 ''' <summary> ''' 格納データのフォーマット ''' </summary> ''' <remarks></remarks> をコーディングしてください。 さて、説明ですが Public Class Ranking Public name As String Public score As Integer End Class というクラスを宣言しています。 シリアライズ可能ですよというしるしとして。 <Serializable()>をつける必要があります。 そうすると以下のようになります。 <Serializable()> Public Class Ranking Public name As String Public score As Integer End Class Public Class Ranking がずれてしまってみずらいため、 <Serializable()> _ Public Class Ranking Public name As String Public score As Integer End Class と記述しました。 ''' <summary> ''' 格納データのフォーマット ''' </summary> ''' <remarks></remarks> はXMLによるオブジェクトの説明を記述しています。 Private宣言以上の参照範囲のオブジェクトにはXMLタグによる説明付けを行うことができます。 XMLでの説明を付与しておくことで、 Dim myrank As New Ranking With {.name = name1, .score = score} のロジックのRankingにカーソルを合わせると、summaryの内容を標示することができます。

taikoshu1
質問者

補足

たとえばファイル出力できたとして、 読み込んで、フォームに出力する際、どういう感じで出力したらよいでしょうか? 最初はラベルでやっていたのですが、このプログラムだとすべて空白のまま出力されてしまいます。。。 nameいち.Text = rank1(0, 0) nameに.Text = rank1(0, 1) nameさん.Text = rank1(0, 2) nameよん.Text = rank1(0, 3) nameご.Text = rank1(0, 4) いち.Text = rank1(1, 0) に.Text = rank1(1, 1) さん.Text = rank1(1, 2) よん.Text = rank1(1, 3) ご.Text = rank1(1, 4) ↑のような感じです。 よろしくお願いいたします。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '今回登録するデータ Dim name1 As String = "テスト" Dim score As Integer = 10 'ワーク用エリア Dim rank As List(Of Ranking) = Nothing 'データファイルパス Const datpath As String = "D:\desk\学校ファイル\tez授業\VB\rensyakyo\rensyakyo\bin\Debug\Ranking.txt" 'ファイル読み込み If System.IO.File.Exists(datpath) AndAlso New System.IO.FileInfo(datpath).Length > 0 Then 'ファイルストリームを使用して読み込む Using fr As New System.IO.FileStream(datpath, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) Try 'シリアライズされたデータの展開 Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter rank = bf.Deserialize(fr) Catch ex As Exception Throw End Try End Using End If 'ファイルなしの場合 If rank Is Nothing Then rank = New List(Of Ranking) End If '追加用データ作成 Dim myrank As New Ranking With {.name = name1, .score = score} 'VB2005以前の場合 'Dim myrank As New Ranking 'myrank.name = name1 'myrank.score = score 'データ追加 rank.Add(myrank) 'スコアの降順にソート rank.Sort(AddressOf hikaku) '登録データのインデックスを取得 If rank.IndexOf(myrank) < 4 Then '状況.Text = "ランクインしました!!" Console.WriteLine("Rank In") Else '状況.Text = "またがんばれよ!""" Console.WriteLine("Out of Rank") End If 'nameいち.Text = rank(0).name 'いち.Text = rank(0).score 'ファイル出力 Using fw As New System.IO.FileStream(datpath, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.None) Try 'ワーク用エリアシリアライズして出力 Dim bt() As Byte Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter Dim ms As New System.IO.MemoryStream bf.Serialize(ms, rank) bt = ms.ToArray fw.Write(bt, 0, bt.Count) Catch ex As Exception Throw End Try End Using End Sub ''' <summary> ''' ソートロジック ''' </summary> Function hikaku(ByVal x As Ranking, ByVal y As Ranking) As Integer Return y.score - x.score End Function End Class ''' <summary> ''' 格納データのフォーマット ''' </summary> ''' <remarks></remarks> <Serializable()> _ Public Class Ranking Public name As String Public score As Integer End Class こんな感じでやってみてください。

taikoshu1
質問者

補足

ここまで詳しく書いていただいてありがたいのですが、どうしてもエラーが出ます。 ''' <summary> ''' 格納データのフォーマット ''' </summary> ''' <remarks></remarks> <Serializable()> _ 特に↑の部分です。。。 初心者なので申し訳ありません。 ちなみに開発環境はVisual Studio 2008です

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>しかしいろいろ試してみたのですが、残念ながらうまく出力されていないのか、2度目に動かしたらエラーがでます。 提示してみた方が、間違いを見て貰えて勉強になるかも知れませんよ。

taikoshu1
質問者

補足

Private Sub エンディング_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim score As Integer score = kekka Dim i As Integer Dim j As Integer Dim nametaihi As String Dim scoretaihi As Integer Dim flag As Integer Dim flag1 As Integer Dim rankflag As Integer Dim maxrec, ii, rec As Integer Dim n As Integer = FreeFile() 'ファイル読み込み FileOpen(n, "D:\desk\学校ファイル\tez授業\VB\rensyakyo\rensyakyo\bin\Debug\Ranking.txt", OpenMode.Input) ii = 0 Input(n, rank(0, 0)) Input(n, rank(0, 1)) Input(n, rank(0, 2)) Input(n, rank(0, 3)) Input(n, rank(0, 4)) Input(n, rank(1, 0)) Input(n, rank(1, 1)) Input(n, rank(1, 2)) Input(n, rank(1, 3)) Input(n, rank(1, 4)) FileClose(n) rec = 1 i = 0 j = 0 '探索 flag1 = 0 flag = 0 i = 0 Do While Val(rank(1, i)) >= score i = i + 1 Loop rankflag = i j = 5 If rankflag <= 4 Then Do While 1 <= j rank(0, j) = rank(0, j - 1) rank(1, j) = rank(1, j - 1) j = j - 1 Loop j = 0 Do While j <= i - 1 rank(0, j) = rank(0, j + 1) rank(1, j) = rank(1, j + 1) j = j + 1 Loop End If rank(0, rankflag) = name1 rank(1, rankflag) = score If rankflag < 5 Then 状況.Text = "ランクインしました!!" Else 状況.Text = "またがんばれよ!" End If nameいち.Text = rank(0, 0) nameに.Text = rank(0, 1) nameさん.Text = rank(0, 2) nameよん.Text = rank(0, 3) nameご.Text = rank(0, 4) いち.Text = rank(1, 0) に.Text = rank(1, 1) さん.Text = rank(1, 2) よん.Text = rank(1, 3) ご.Text = rank(1, 4) 'ファイル出力 FileOpen(n, "D:\desk\学校ファイル\tez授業\VB\rensyakyo\rensyakyo\bin\Debug\Ranking.txt", OpenMode.Output) WriteLine(n, rank(0, 0), rank(0, 1), rank(0, 2), rank(0, 3), rank(0, 4)) WriteLine(n, rank(1, 0), rank(1, 1), rank(1, 2), rank(1, 3), rank(1, 4)) FileClose(n) End Sub です。 おねがいいたします

関連するQ&A