none
StreamWriterの使い方 RRS feed

  • 質問

  • どうも基本的なことがわかっていないので困っています。
    ログ&デバッグ的なファイル書き込みをしいたので、例として次のコードためしましが、
    31行目でエラーとなります。なにが悪いのかわかりません。
    ネット等の例を参考にしたコードですが、fplはusing行の処で定義しているつもりなのですが。
    よくわかっていないのですが、usingは普通1行目のように使うものと思っていましたので、このような使い方もわかりません。
    fpl(クラスへのポインターという??)は、このままではForm1しか有効でなく、button_clickでも有効なのかも疑問です。
    なおファイル名は起動のたびに時間要素が必要です。例ではボタンクリックごとにその時刻を書き込むようにしています。
    さらには、クローズ処理(Dispose?)もどこでやればよいかも調べています。
    よろしくご教示をお願いします。

    エラー CS0103 現在のコンテキストに 'fpl' という名前は存在しません。 31

    using System.IO;
    namespace test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                DateTime time = DateTime.Now;
                String fname=time.ToString("MMDDHHmm");
                fname = "c:\\fxs\\HL"+fname+".txt";
                using (StreamWriter fpl = new StreamWriter(fname)) ;
                time = DateTime.Now;
                String str = time.ToString("MMDDHHmmSS");
                fpl.WriteLine(str);     <----エラー行
            }
            private void button1_Click(object sender, EventArgs e)
            {
                DateTime time = DateTime.Now;
                String str = time.ToString("MMDDHHmmSS");
                fpl.WriteLine(str);
            }
        }
    }

    2019年10月18日 2:43

回答

  • > 試したコードは{ } で囲った場合と同じなので、未定義となるのですね。

    「同じ」とはどういう意味ですか? 同じくエラーが出たと言ってます?

    > fnameが固定なら良いですが、open時点の時刻で表すことがわかりません。

    StreamWriter fpl; を Form1 のプライベートフィールドとして定義し、using 句は使わないで Form1() で new StreamWriter(fname)) として初期化して fpl に代入し、それを button1_Click でも使い回すということにしてはいかがですか? 

    Dispose は Form1 がクローズされる時に行うということにしては? 例外が発生して Dispose されない可能性がありますが、そこはガベージコレクタが働いたときに処理してくれるということで割り切って。
    • 回答としてマーク sige2 2019年10月26日 9:28
    2019年10月18日 4:39

すべての返信

  • > usingは普通1行目のように使うものと思っていましたので、このような使い方もわかりません。

    以下のように { } で囲ってみてください。using 句を抜けたところで StreamWriter は自動的に Dispose されます。

    using (StreamWriter fpl = new StreamWriter(fname))
    {
        time = DateTime.Now;
        String str = time.ToString("MMDDHHmmSS");
        fpl.WriteLine(str);
    }

    > fpl(クラスへのポインターという??)は、このままではForm1しか有効でなく、button_clickでも有効なのかも疑問です。

    Form1 メソッド(コンストラクタ)内で定義されているのでその中でしか有効でないです。button_click メソッド内では無効です。

    「C# 変数 スコープ」などで検索するといろいろ参考になる記事がヒットすると思いますので、調べてください。

    2019年10月18日 3:26
  • 早速のご返事ありがとうございます。

    試したコードは{ } で囲った場合と同じなので、未定義となるのですね。

    それではfplがusing句そしてForm1以外でも有効にするにはどのようにすればよいか、お教え願えませんか。

    StreamWriter fpl = new StreamWriter(fname);

    Form1{

    fpl.writeline

    などとできればよいのですが、fnameが固定なら良いですが、open時点の時刻で表すことがわかりません。

    2019年10月18日 3:49
  • > 試したコードは{ } で囲った場合と同じなので、未定義となるのですね。

    「同じ」とはどういう意味ですか? 同じくエラーが出たと言ってます?

    > fnameが固定なら良いですが、open時点の時刻で表すことがわかりません。

    StreamWriter fpl; を Form1 のプライベートフィールドとして定義し、using 句は使わないで Form1() で new StreamWriter(fname)) として初期化して fpl に代入し、それを button1_Click でも使い回すということにしてはいかがですか? 

    Dispose は Form1 がクローズされる時に行うということにしては? 例外が発生して Dispose されない可能性がありますが、そこはガベージコレクタが働いたときに処理してくれるということで割り切って。
    • 回答としてマーク sige2 2019年10月26日 9:28
    2019年10月18日 4:39
  • 今頃気づいて何ですが、投稿するフォーラムは C++ ではなく C# にしてください。

    Microsoft の管理者の方>

    フォーラムの移動をお願いします。

    2019年10月18日 4:41
  •  下記のように、単にStreamWriter fpl; を 

    public Form1の外に変数と同じように書けばよかったのですね。

    usingに2種類あり、using();に惑わされました。わかれば今後それに倣うだけです。

    また投稿スレッドを間違えて済みませんでした。C++も投稿したもので。

    エラーのないコード

       public partial class Form1 : Form
        {
            StreamWriter fpl;

            public Form1()
            {
                InitializeComponent();
                DateTime time = DateTime.Now;
                String fname=time.ToString("MMddHHmm");
                fname = "c:\\fxs\\mt4\\HL"+fname+".txt";
                fpl = new StreamWriter(fname) ;
    //            using (StreamWriter fpl = new StreamWriter(fname)) ;
                time = DateTime.Now;
                String str = time.ToString("MMddHHmmss");
                fpl.WriteLine(str);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                DateTime time = DateTime.Now;
                String str = time.ToString("MMddHHmmss");
                fpl.WriteLine(str);
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                fpl.Close(); ;
            }
        }

    • 回答の候補に設定 IKEDA Makoto 2019年10月25日 13:50
    • 回答の候補の設定解除 IKEDA Makoto 2019年10月25日 13:50
    • 回答の候補に設定 IKEDA Makoto 2019年10月25日 13:50
    2019年10月18日 5:59
  • このスレッドの課題は解決したと理解していますが、そうであればクローズ願います。
    2019年10月18日 6:15
  • SurferOnWwwさん、ご確認ありがとうございます。

    sige2さん、こんにちは。フォーラム オペレーターのHarukaです。

    ご質問内容から以下フォーラムのほうが投稿場所として適切かと思いましたので、
    質問の移動をさせていただきました。
    Visual Studio Development > Visual C#
    移動後はスレッドの URL が変わりますが以前の URL でもリダイレクトされて、
    以前のページが表示されますのでご安心ください。

    また、ご質問いただいた件ですが、その後いかがでしょうか。
    参考になった投稿には [回答としてマーク] をお願い致します。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年10月24日 3:01
    モデレータ