none
入力文字列の形式が正しくありません。 RRS feed

  • 質問

  • ポーカーゲームを作り始めて、ゲームは出来ました。

    特に支障なく動くようです。

    記録を残そうと思い、下記のようにログファイルを追加してデバックをすると

    「入力文字列の形式が正しくありません。」とのメッセージが表示されます。

    ゲームそのものは、それまで通り出来るようです。

    終了時には、

    「別のプロセスで使用されているため、プロセスは、ファイル

    'C:¥Card¥Card¥bin¥Debug¥score.log'にアクセスできませんでした。」

    ということで、ログの保存はできませんでした。

    色々調べたのですが、わかりませんでした。

    ご教授戴ければ助かります。

    なお、¥マークは、「/」に変わってしまうので、あえて全角で打っています。(実際は半角)

     

    namespace Card
    {
        public partial class Form1 : Form
        {

          private string logPath = Application.StartupPath + "¥¥score.log"; 
             private scoreDataClass scoreData;

    public Form1()
            {
                InitializeComponent();
                scoreData = new scoreDataClass(logPath);
           
    }

    途中省略

    public class scoreDataClass
        {
            private enum logField
            {
                moneyField, loanField
            }
            private int myMoney = 0;
            private int myLoan = 0;
            private string thisFilePath;

            public scoreDataClass(string logFileName)
            {
                string rowBuffer;
                string[] rowData;
                System.IO.StreamReader logStremReader;

                thisFilePath = logFileName;
                if (System.IO.File.Exists(thisFilePath) == false)
                {
                    return;
                }

                try
                {
                    logStremReader = new System.IO.StreamReader(
                        thisFilePath, System.Text.Encoding.Default);
                    rowBuffer = logStremReader.ReadLine();
                    while (rowBuffer != null)
                    {
                        rowData = rowBuffer.Split('\t');
                        myMoney = int.Parse(rowData[(int)logField.moneyField]);
                        myLoan = int.Parse(rowData[(int)logField.loanField]);
                        rowBuffer = logStremReader.ReadLine();
                    }
                    logStremReader.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Application.ProductName
                        , MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            public bool writeMoney(int money, int loan)
            {
                string scoreData = money.ToString() + '\t'
                    + loan.ToString();

                try
                {
                    System.IO.StreamWriter logStreamwriter =
                        new System.IO.StreamWriter(thisFilePath
                            , true, System.Text.Encoding.Default);

                    logStreamwriter.WriteLine(scoreData);
                    logStreamwriter.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Application.ProductName
                        , MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            public bool resetMoney()
            {
                myMoney = 0;
                myLoan = 0;
                return true;
            }
            public bool setNewData(int money, int loan)
            {
                myMoney = money;
                myLoan = loan;
                return false;
            }
            public int MyMoney
            {
                get
                {
                    return myMoney;
                }
            }
            public int MyLoan
            {
                get
                {
                    return myLoan;
                }
            }
        }
    }

    2011年10月3日 5:14

回答

  • 外池と申します。

    一気にすべてを解決する指摘をすることはできないのですが、調べる方針として、ひとつ提案があります。

    ★ 最初から、try catchを使うことはしない。
    ★ 少なくとも、catchで、全部のexceptionを捕まえるようなことはしない。
    ☆ あるいは、例外が発生した場所で止まるように設定して、デバッグする。

    その上で、例外が発生する理由と場所をよく確かめてください。

    まったくの邪推ですが、例外が発生して、ファイルを閉じないままtry catchを抜けて、同じファイルを再度開こうとしているのではないかと。


    (ホームページを再開しました)
    • 回答としてマーク でぃで 2011年10月3日 6:37
    2011年10月3日 5:27

すべての返信

  • 外池と申します。

    一気にすべてを解決する指摘をすることはできないのですが、調べる方針として、ひとつ提案があります。

    ★ 最初から、try catchを使うことはしない。
    ★ 少なくとも、catchで、全部のexceptionを捕まえるようなことはしない。
    ☆ あるいは、例外が発生した場所で止まるように設定して、デバッグする。

    その上で、例外が発生する理由と場所をよく確かめてください。

    まったくの邪推ですが、例外が発生して、ファイルを閉じないままtry catchを抜けて、同じファイルを再度開こうとしているのではないかと。


    (ホームページを再開しました)
    • 回答としてマーク でぃで 2011年10月3日 6:37
    2011年10月3日 5:27
  • 早々のご返信ありがとうございます。

    まだ始めたばかりで、書籍のプログラムを参考にしながらやっているものですから

    つまづきっぱなしなのが現状です。

    try catch も、書籍の説明で推奨されていたものですが、不都合が生ずることもあるのですね。

    取り敢えず、try catchをはずしてから調べてみます。

    ありがとうございました。

    2011年10月3日 5:51
  • 外池です。

    補足しますと、「例外」の発生には、大きく分けて、二種類あると思います。

    ひとつは、プログラムのミスが原因で起こるものです。これは、try catchで拾うべきではありません。なので、私は、ほとんどミスを潰しきるまでは、try catchは使うべきではないと思っています。

    もうひとつは、プログラムにミスは無いが、プログラムが動いている周りの状況が原因で発生することがあり得る、また、避け得ないものです。例えば、ハードディスクを使い切ったとか、ネットワークの通信が滞ったとか。これらは、try catchで拾って、適切に対処してやれば良いでしょう。ただ、基本的に、どのような例外が発生するか、予め把握しておくべきで、例外の種類ごとに丁寧に処理を分化させなければなりません。想定外の例外については、キチンと止まるようにしておくべきです。


    (ホームページを再開しました)

    • 編集済み 外池 2011年10月3日 6:50
    2011年10月3日 6:13
  • try catch をコメントアウトしてからデバッグしたところ、

    myMoney = int.Parse(rowData[(int)logField.moneyField]);

    の場所で停止しました。

    書籍のプログラムでは、日付を記録するようになっていた箇所なので、パソコンの

    score.log を削除したところ、問題解決となったようです。

    わかってしまえば単純なことですが、ここに辿り着くまではやはり大変です。

    それでも、このことで又一つ覚えることが出来ました。

    初心者にとっては、少しの助言でも大きなヒントになります。

    また何かありましたら(まだまだ有ると思います)、宜しくお願いいたします。

    ありがとうございました。

    2011年10月3日 6:38
  • 外池です。

    でぃでさんは納得されたようなので、まぁ、良いですが・・・。

    「score.logを削除した」という対処と、「myMoney = int.Parse(云々)」の行で発生している例外が解消した(のかな?)ことと、私は因果関係が理解できませんので、問題解決なのかどうかコメントできません。


    (ホームページを再開しました)
    2011年10月3日 6:57
  • public class scoreDataClass
    {
    private enum logField
    {
    moneyField, loanField

     

    少し、説明不足だつたかも知れません。 

    最初は、dataField,moneyField として日付と数値を保存させるようにプログラムを組んでいました。

    そして、何回かデバッグをしています。

    その時には問題なく保存もされていました。

    それから、moneyField,loanField に書き換えてデバッグをしたことにより、日付形式の場所に数値を上書きしようとしたから、「入力文字列の形式が正しくありません。」となったものと解釈しております。

    score.logを削除したことで、新規に作成されることから、メッセージが出なくなったものと理解しています。

    それ以外に何かが有ったとしてもわかりません。

    2011年10月3日 7:35
  • 察するに、最初は書籍のサンプルのまま実行していて、後でフィールドの意味を変えてしまい、前のファイルが残ったまま実行していたので解釈不能として例外がでていたと言うことでしょうか。

    今の時点で原因を推測、説明できないことは仕方ないかもしれませんが、なぜ起きたのか気にすることは重要です。
    今後、問題が発生した際にも気にしてください。でないと、「動いたし、まあいっか」で済ませていると、いつか不具合で痛い目に遭います。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年10月3日 13:52
    モデレータ