テキストデータの読み込みについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Gazzte

テキストデータの読み込みについて

#1

投稿記事 by Gazzte » 9年前

プログラミングに興味を持ち始めたばかりのものです。
Windows7 にVisual Studio Express 2015 をインストールしりようしています。

フォームを開くと10行のテキストデータの読み込み1行ずつに分割してそれぞれの変数に格納し、LabelのTextにそれぞれを表示させたく下記のように書きました。
しかし、変数が未割り当てのローカル変数となりました動きません(エラーコード:CS0165)
どのようにしたら希望の表示がされるのかよろしくおねがいします。

コード:

using System;
using System.Text;
using System.Windows.Forms;
using System.IO ;          // for StreamReader
using System.Text.RegularExpressions;  // for Regex


namespace GameEdter
{
    public partial class Form_State : Form
    {
        public Form_State()
        {
            InitializeComponent();
        }

        private void Form_State_Load(object sender, EventArgs e)
        {
            string _File = @"./dat.txt";

            string st_name;
            string st_lv;
            string st_str;
            string st_agi;
            string st_dex;
            string st_vit;
            string st_int;
            string st_min;
            string st_luk;
            string st_type;

            string text = File.ReadAllText(_File, Encoding.Default);

            Match match = Regex.Match(text, "\n(.+)");
            if (match.Success)
            {
                st_name = text.Substring(0, match.Index + 1);  // 行末の改行コードも含める
                st_lv = text.Substring(1,match.Index + 1);
                st_str = text.Substring(2,match.Index + 1);
                st_agi = text.Substring(3,match.Index + 1);
                st_dex = text.Substring(4,match.Index + 1);
                st_vit = text.Substring(5,match.Index + 1);
                st_int = text.Substring(6,match.Index + 1);
                st_min = text.Substring(7,match.Index + 1);
                st_luk = text.Substring(8,match.Index + 1);
                st_type = text.Substring(9,match.Index + 1);
            }

            label_name.Text = st_name;
    label_lv.Text = st_lv;
        }
    }
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: テキストデータの読み込みについて

#2

投稿記事 by YuO » 9年前

質問するときには言語を書かないと,どの言語についての質問かがわかりません。
とりあえず,コードを見た感じやエラーコードからC#であると仮定します。
Gazzte さんが書きました:しかし、変数が未割り当てのローカル変数となりました動きません(エラーコード:CS0165)
これは,「理論上実行されうるプログラムのパス」の中で,「一度も代入がないローカル変数から読み取り得る」場合に発生します。
今回の場合だと,match.Successが偽の場合,st_nameやst_lvに値が代入されないまま,49行目や50行目で読み取られています。

回避策は,
  • 代入されないパスでは使わない
  • 常に代入する
といった方法になります。
基本的には変数の宣言自体を代入時点にした上で前者を採るべきですが,場合によっては後者を使った方がよい場合もあります。

前者で今回のコードについての断片を書くならば,

コード:

// 元コード21行目から30行目,49行目から50行目は削除。
            if (match.Success)
            {
                var st_name = text.Substring(0, match.Index + 1);  // 行末の改行コードも含める
                var st_lv = text.Substring(1,match.Index + 1);
                var st_str = text.Substring(2,match.Index + 1);
                var st_agi = text.Substring(3,match.Index + 1);
                var st_dex = text.Substring(4,match.Index + 1);
                var st_vit = text.Substring(5,match.Index + 1);
                var st_int = text.Substring(6,match.Index + 1);
                var st_min = text.Substring(7,match.Index + 1);
                var st_luk = text.Substring(8,match.Index + 1);
                var st_type = text.Substring(9,match.Index + 1);

                label_name.Text = st_name;
                label_lv.Text = st_lv;
            }
のように、分岐内に代入を入れてしまえばよいです。

ただし,if文の分岐内のコードは恐らく希望と違うでしょうし,そもそもFile.ReadAllLines使えば正規表現で行ごとに分割する必要がないかと思います。

Gazzte

Re: テキストデータの読み込みについて

#3

投稿記事 by Gazzte » 9年前

>YuOさん
早々の返信有り難うございます。
YuO さんが書きました:質問するときには言語を書かないと,どの言語についての質問かがわかりません。
とりあえず,コードを見た感じやエラーコードからC#であると仮定します。
申し訳ありません。ご推察の通りC#です。

頂いたアドバイスを元に17行目以降を下記のように変更したところ希望の動作をさせることができました。
ありがとうございました。

コード:

        private void Form_State_Load(object sender, EventArgs e)
        {
            string _File = @"./dat.txt";

            string[] text = File.ReadAllLines(_File, Encoding.Default);

            string st_name = text[0];
            string st_lv = text[1];
            string st_str = text[2];
            string st_agi = text[3];
            string st_dex = text[4];
            string st_vit = text[5];
            string st_int = text[6];
            string st_min = text[7];
            string st_luk = text[8];
            string st_type = text[9];

            label_name.Text = st_name;
            label_lv.Text = st_lv;
        }
    }
}

閉鎖

“C言語何でも質問掲示板” へ戻る