不使用 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);
.
我试图将串行数据从 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);
.