无法使用Debug.Write()删除回车符和换行符

时间:2015-06-05 17:09:38

标签: c# streamwriter

我正在尝试将Visual C#中的GUI中的串行数据输出到文本文件中,但是,当我输出它时,它会在每行上打印一个字符。我试图用.TrimEnd('\ r','\ n'),. Trim()和.Replace(“\ r \ n”,“”)替换回车符和换行符.Replace(“\ n“,”“)。替换(”\ r“,”“)。

问题:当我使用Debug.Write(文本)时,它在我单步执行代码时正确显示输出,但是当我在没有调试的情况下运行它时,文件每行只有一个字符。

问题:如何在运行整个程序时删除回车符和换行符?

以下是相关代码:

namespace Instrument_GUI
{
    public partial class Form1 : Form
    {
        private StreamWriter StoreData1;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void cbo_Instrument_1_SelectedIndexChanged(object sender, EventArgs e)
        {
            DateTime time = DateTime.Now;
            string date = string.Format("{0:d}-{1:d}-{2:d}", time.Year, time.Month, time.Day);
            string path = "C:\\Users\\rafii\\Desktop\\";
            if (cbo_Instrument_1.Text=="GPS")
            {
                string file = path + date + '_' + cbo_Instrument_1.Text + ".txt";
                txt_filename_1.Text = file;
                txt_COM_PORT_1.Text = "COM11";
                txt_BAUDRATE_1.Text = "4800";
            }
            string instrument = cbo_Instrument_1.Text;
            string file1 = path + date + '_' + instrument + ".txt";
            StoreData1 = new StreamWriter(new FileStream(file1, FileMode.Create, FileAccess.Write));
        }

        delegate void SetTextCallback(string text);
        string InputData = String.Empty;

        private void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = serialPort1.ReadExisting().Trim();
            if (InputData != String.Empty)
            {
                this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });    
            }
        }

        private void SetText(string text)
        {
            if (chk_DISPLAY_1.Checked == true)
            {
                TextBox1.Text += text;
            }
            if (chk_SAVE_FILE.Checked == true)
            {
                Debug.Write(text);
                StoreData1.WriteLine(text.Replace("\r\n", "").Replace("\n", "").Replace("\r", ""));

                StoreData1.Flush();
            }
        }
    }    
}

1 个答案:

答案 0 :(得分:0)

首先,TextWriter.WriteLine()方法专门设计为 ,以便为传递它的任何内容添加换行符。假设串行I / O足够慢以至于为接收到的每个字符调用数据接收处理程序,那么是的,您会发现输出文件在每个字符之间都有换行符。

您可以观察到略有不同的结果,在较大的文本块之间添加换行符,具体取决于在调用数据接收处理程序之前缓冲串行数据的准确程度。

因此,您应该拨打WriteLine()

,而不是致电Write()

另请注意,如果您要删除单个\r\n个字符,那么查找这些字符对也没有意义。只需删除\r\n字符,即可完成配对。 (顺便说一下,我还注意到使用string.Replace()方法可能很昂贵,尤其是在循环上下文中或在同一对象上多次调用它时。)

即。你的代码看起来应该更像这样:

StoreData1.Write(text.Replace("\n", "").Replace("\r", ""));

现在,请注意上面的内容会从数据中删除所有换行符。这将在输出文件中生成单个连续的文本行。如果那是你想要的,那很好。但是,如果您将调用Replace()放在那里的唯一原因是因为您尝试删除了额外的换行符,那么您可能真正想要的就是{{1} }。