0

私は現在、プロジェクトに取り組んでいます。しかし、私は C# があまり得意ではありません。G コード ファイルを開いてデータを読み取り、USB 経由で CNC マシンに送信する必要があります。データを読み取って送信できます。しかし今、私は1行を読んでUSB経由で送信し、次の行を読みたいと思っています。以下に、Gコードファイルとその他の関連データを読み取るために使用したコードを添付しました。

g コード ファイルを開き、すべてのデータをテキスト ボックスに読み込みます。

 private void btnopen_Click(object sender, EventArgs e)
    {
        //OpenFileDialog1.ShowDialog();
        OpenFileDialog file = new OpenFileDialog();
        file.FileName = "";
        file.Title = "Open A Text document.";
        file.Filter = "(*.gc)|*.gc|(*.etf)|*.etf|(*.txt)|*.txt|(*.GC)|*.GC|(*.tap)|*.tap";
        DialogResult result = file.ShowDialog();
        if (result == DialogResult.OK)
        {
            System.IO.StreamReader OpenFile = new System.IO.StreamReader(file.FileName);


            textBox1.Text = OpenFile.ReadToEnd();

            OpenFile.Close();


        }

開いたファイルから XYZ 座標を読み取ります。

  private void button1_Click(object sender, EventArgs e)
    {


        Regex Gcode = new Regex("[ngxyzf][+-]?[0-9]*\\.?[0-9]*", RegexOptions.IgnoreCase);
        MatchCollection m = Gcode.Matches(this.textBox1.Text);


        double X, Y, Z, F;


        int g_code = 0;
        int x_code = 0, y_code = 0, z_code = 0;
        float x = 0, y = 0, z = 0;


        foreach (Match n in m)
        {

            if (n.Value.StartsWith("G"))
            {
                g_code = Convert.ToInt32(ExtractNumbers(n.Value));
            }

            if (n.Value.StartsWith("X"))
            {
                x = float.Parse(ExtractNumbers(n.Value));
                x = x * 1000;
                x_code = Convert.ToInt32(x);

            }

            if (n.Value.StartsWith("Y"))
            {
                y = float.Parse(ExtractNumbers(n.Value));
                y = y * 1000;
                y_code = Convert.ToInt32(y);

            }

            if (n.Value.StartsWith("Z"))
            {
                z = float.Parse(ExtractNumbers(n.Value));
                z = z * 1000;
                z_code = Convert.ToInt32(z);
            }
        }


        ExchangeInputAndOutputReports(g_code,x_code, y_code,z_code);

}

4

4 に答える 4

3

少しのリファクタリングは、コードを改善するのに役立ちます。
最初にボタン クリックからコードを抽出し、文字列を受け取り、ライン上にあるコマンドを操作するプライベート メソッドを構築します。次に、ファイルを開くメソッドを変更して、一度に 1 行を読み取り、各行に対して抽出されたメソッドを呼び出します...

using(StreamReader OpenFile = new System.IO.StreamReader(file.FileName))
{
    string textLine = string.Empty;
    // Loop until the end of file and call the operation for the line
    while((textLine = OpenFile.ReadLine()) != null)
        ExecuteLine(textLine);
}

private void ExecuteLine(string line)
{
    Regex Gcode = new Regex("[ngxyzf][+-]?[0-9]*\\.?[0-9]*", RegexOptions.IgnoreCase);
    MatchCollection m = Gcode.Matches(line);
    ....
}

もちろん、ボタンのクリックからも新しいプライベート メソッドを呼び出して、以前の機能を維持することを忘れないでください。

private void button1_Click(object sender, EventArgs e)
{
     ExecuteLine(textBox1.Text);
}
于 2013-06-19T16:14:20.157 に答える
1

それ以外の

textBox1.Text = OpenFile.ReadToEnd();

あなたがしたいでしょう

string line = OpenFile.ReadLine();
while (line != null)
{
    // do something with line
    line = OpenFile.ReadLine();
}
于 2013-06-19T16:12:11.103 に答える
0

ファイル全体を一度に読み取っているだけです。それを行ってから、メモリ内オブジェクトから各行を読み取るか、ファイルから一度に 1 行ずつ直接読み取ることができます。2 番目の方法は、より冗長で理解しやすい方法ですが、途中でエラーや何かが発生した場合に、ファイルを開いたままにしておく傾向があります。

これは、一度に 1 行ずつ読み取る方法を示すデモ プログラムです... http://www.dotnetperls.com/file-readlines

于 2013-06-19T16:11:25.940 に答える