• 締切済み

[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

  • VB 配列の内容をファイルに書き込む

    VB2008を使用しています。 stg_bitという配列に一文字ずつ「abc・・・」 のように入っているものを、テキストファイルに出力したいのですが・・・ stg_bitという配列の内容をファイルに書き込みたいのですが、 うまくいきません。 ご教授お願いします!! Dim i As Integer Dim stg_str As String Dim Writer As New IO.StreamWriter("C:sample.txt") Writer.WriteLine(stg_bit) Writer.Close()

  • vbで出力したテキストファイルを7日後に削除したい

    はじめまして。 vbで出力したテキストファイルを7日後に削除するプログラムを考えております。 参考になるコードもしくは関数、ホームページがありましたら教えてください。 よろしくお願い致します。

  • 数字の入った配列をファイルへ出力。

    今、hist[256]というint型の配列に数字が入っているとします。 これを、テキストファイルに出力して、 0 242 5654 232 3123 756 ・ ・ ・ こんな感じで、ファイルに出力したいです。 文字としての出力になるのでhist[256]配列を、int型からchar型に変換しないとダメでしょうか? また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね? もっと大きい数字も入っているので何とかする方法も教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

  • csv出力した内容を配列で取得できますか?

    データベースのテーブル内容をサーバー上にcsv出力すると同時に出力した内容を配列で取得できないでしょうか?(PDOを利用しています) $sql= "SELECT id, name FROM tb INTO OUTFILE '/tmp.csv'"; $stmt = $dbh->query($sql); これでcsvは出力されるのですが、csv出力した内容を配列で取得したく、 $array = $stmt->fetchAll(PDO::FETCH_ASSOC); をするとGeneral Errorとなります。 先にSELECTで内容を配列で取得してから配列のループでcsvの内容を作成し、出力する方法もありますが、データ量が数十万件あるのでループ処理が遅い気がしています。 良い方法があればお教えください。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • サイズの大きなテキストファイルのSORT

    3GB超のテキストファイルをSORTコマンドでソートしたいのですが、空(0KB)の出力ファイルが出来て処理が終わってしまいます。 数KB~数MBのテキストでは正常にソートされるのですが、GB単位になると上記の現象が発生します。 環境はWindowsNTServer4.0です。 ソートできるファイルサイズの上限、ディスクの空き容量等、制限があるのでしょうか? また、上記の現象を回避し、正常にソートする方法をご存知な方がいらっしゃいましたら、どうぞご教授ください。 宜しくお願い致します。 ↓ソートコマンドは至ってシンプルです。 sort /+1 < TEST.dat > OUT.txt

  • 配列のファイル出力について

    fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。

  • ファイルの内容を配列に格納したい

    困っているので、皆様の力を貸してください。 以下のようなファイルを読み込み、kのインデックスでソートしてから 配列に格納したいのですがどのようにしたらできますでしょうか? -------------------ファイル内容------------------------------ (= k0 9999) (= k1 1111) (= k2 2222) (= k4 4444) (= k3 3333) ------------------------------------------------------------- 上のファイルの場合は int[0] = 9999; int[1] = 1111; int[2] = 2222; int[3] = 3333; int[4] = 4444; といったように配列に格納したいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • テキストファイルクリア .net2005 VB

    VB初心者です。よろしくお願いたします。 現在 .net2005 VBでPL/SQLの処理結果を「log.txt」に出力しておりますが、処理をするたびに、テキストファイルの下へどんどん追加されます。 そこで、画面上からログクリアボタンを押下すると、「log.txt」の中身が初期化されるようにしたいと考えて降ります。 どうすればよいか、サンプルのロジックを教えて頂けませんでしょうか?

  • GB2312、BIG5でのテキスト出力

    ちょっと興味を持った内容なのですが…。 簡体字・繁体字テキストを開く場合は、(ツールにもよりますが)文字コードとして 掲題のものを指定して開けば問題無いかと思います。 またプログラミングでこれらのテキストを読み込む場合も、単に向こうのコードということを 念頭に置いて処理すれば同様に問題無いかと思います。 しかし、BIG5などをプログラムからテキスト出力させることは可能なのでしょうか? UNICODE系ならファイルの先頭に特定のコードを付与すれば良いようですが、 例えば「UTF8で書かれたテキストをGB2312にして出力」するには どのように設定すれば良いのでしょう?

  • 配列のファイルへの出力について

    fortranでできるファイルへの配列の出力をJAVAでどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるJAVAプログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 JAVAにはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 この質問は、C言語について以前質問したものですQNo.3590702。 JAVAだったらどうなるだろうと思ってお尋ねしています。

    • ベストアンサー
    • Java

専門家に質問してみよう