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

Unable to Remove Carriage Returns and Line Feeds Without Using Debug.Write()

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

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

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

相关代码如下:

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();
            }
        }
    }    
}

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

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

所以不要调用 WriteLine(),你应该调用 Write().

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

即您的代码应该更像这样:

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

现在,请注意上面的操作从数据中删除了 all 个换行符。这将在输出文件中生成一行 运行-on 文本。如果那是你想要的,那就太好了。但是如果你把调用 Replace() 的唯一原因放在那里是因为你试图删除你得到的 extra 换行符,那么也许你真正想要的只是 StoreData1.Write(text);.