我正在尝试将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();
}
}
}
}
答案 0 :(得分:0)
首先,TextWriter.WriteLine()
方法专门设计为 ,以便为传递它的任何内容添加换行符。假设串行I / O足够慢以至于为接收到的每个字符调用数据接收处理程序,那么是的,您会发现输出文件在每个字符之间都有换行符。
您可以观察到略有不同的结果,在较大的文本块之间添加换行符,具体取决于在调用数据接收处理程序之前缓冲串行数据的准确程度。
因此,您应该拨打WriteLine()
。
Write()
另请注意,如果您要删除单个\r
和\n
个字符,那么查找这些字符对也没有意义。只需删除\r
和\n
字符,即可完成配对。 (顺便说一下,我还注意到使用string.Replace()
方法可能很昂贵,尤其是在循环上下文中或在同一对象上多次调用它时。)
即。你的代码看起来应该更像这样:
StoreData1.Write(text.Replace("\n", "").Replace("\r", ""));
现在,请注意上面的内容会从数据中删除所有换行符。这将在输出文件中生成单个连续的文本行。如果那是你想要的,那很好。但是,如果您将调用Replace()
放在那里的唯一原因是因为您尝试删除了额外的换行符,那么您可能真正想要的就是{{1} }。