如何在一行写入多字符串?及为Txt数据添加描述的C#实现
解决方案:给Txt文件添加数据描述并实现一行多字符串写入
我来帮你搞定这两个需求!咱们分保存和读取两部分来修改代码,既给每个数据加上清晰的描述,又能灵活实现一行多内容的写入。
一、修改保存文件的代码(Button_Click_1)
我们可以用C#的字符串插值语法轻松拼接描述和数据,同时如果需要在一行写多个内容,直接在同一个WriteLine里组合即可,或者用Write连续写入后换行。
修改后的代码如下:
private void Button_Click_1(object sender, RoutedEventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); // 增加格式过滤,引导用户保存为txt文件 sfd.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"; sfd.DefaultExt = ".txt"; if (sfd.ShowDialog() == true) { // using块会自动释放资源,不用手动Close/Dispose using (StreamWriter write = new StreamWriter(File.Create(sfd.FileName))) { // 单个数据项:一行一个"描述=值"的格式 write.WriteLine($"证书编号={Sertifikasyon.Text}"); write.WriteLine($"飞机型号={ACType.Text}"); write.WriteLine($"飞行类型={FlightType.Text}"); write.WriteLine($"材料类型={Malzeme.Text}"); write.WriteLine($"发动机型号={Motor.Text}"); write.WriteLine($"压缩系数={Kcomp.Text}"); write.WriteLine($"机组人员重量={Wcrew.Text}"); write.WriteLine($"座位数量={Nseat.Text}"); write.WriteLine($"行李重量={Wbaggage.Text}"); // 示例:同一行写入多个字符串(比如多个速度参数) write.WriteLine($"飞行速度 - 失速速度={Vs.Text}, 巡航速度={Vcr.Text}, 长时巡航速度={Vltr.Text}, 爬升速度={Vclmb.Text}"); // 继续其他数据,按需组合单行/多行 write.WriteLine($"最大航程={R.Text}"); write.WriteLine($"效率参数 - 巡航效率={E.Text}, 爬升效率={Eclmb.Text}"); write.WriteLine($"升阻比参数 - 巡航升阻比={Ccr.Text}, 长时巡航升阻比={Cltr.Text}, 爬升升阻比={Cclmb.Text}"); write.WriteLine($"载荷系数 - 巡航载荷={LDcr.Text}, 长时巡航载荷={LDltr.Text}, 爬升载荷={LDclmb.Text}"); write.WriteLine($"功率参数 - 巡航功率={npcr.Text}, 长时巡航功率={npltr.Text}, 爬升功率={npclmb.Text}"); write.WriteLine($"起飞燃油={Runfuel.Text}"); write.WriteLine($"储备燃油={Rresfuel.Text}"); } } }
核心改动说明:
- 添加数据描述:用
$"描述={控件.Text}"的插值语法,直接生成键=值格式的行,可读性拉满。 - 一行多内容写入:把多个相关数据放在同一个
WriteLine里,用逗号或其他分隔符隔开,比如write.WriteLine($"飞行速度 - 失速速度={Vs.Text}, 巡航速度={Vcr.Text}"),就能把多个内容写到同一行。 - 简化资源管理:
using块会自动处理StreamWriter的关闭和释放,不用手动调用Close()和Dispose(),代码更简洁安全。
二、修改读取文件的代码(Button_Click_2)
因为保存的是键=值格式,我们可以逐行读取后拆分键和值,再对应赋值给控件——这种方式比固定顺序读取更健壮,哪怕文件里的行顺序变了也能正确赋值。
修改后的代码如下:
private void Button_Click_2(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"; if (ofd.ShowDialog() == true) { using (StreamReader read = new StreamReader(File.OpenRead(ofd.FileName))) { string line; // 逐行读取文件内容 while ((line = read.ReadLine()) != null) { // 跳过空行,避免无效处理 if (string.IsNullOrWhiteSpace(line)) continue; // 拆分键和值(按第一个=号拆分,防止值里包含=的情况) int equalsIndex = line.IndexOf('='); if (equalsIndex == -1) continue; string key = line.Substring(0, equalsIndex).Trim(); string value = line.Substring(equalsIndex + 1).Trim(); // 根据键匹配对应的控件赋值 switch (key) { case "证书编号": Sertifikasyon.Text = value; break; case "飞机型号": ACType.Text = value; break; case "飞行类型": FlightType.Text = value; break; case "材料类型": Malzeme.Text = value; break; case "发动机型号": Motor.Text = value; break; case "压缩系数": Kcomp.Text = value; break; case "机组人员重量": Wcrew.Text = value; break; case "座位数量": Nseat.Text = value; break; case "行李重量": Wbaggage.Text = value; break; case "最大航程": R.Text = value; break; case "起飞燃油": Runfuel.Text = value; break; case "储备燃油": Rresfuel.Text = value; break; // 处理单行多值的情况(比如飞行速度那一行) case "飞行速度 - 失速速度": // 先按", "拆分多个子项 var speedParts = value.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); foreach (var part in speedParts) { int speedEqualsIndex = part.IndexOf('='); if (speedEqualsIndex == -1) continue; string speedKey = part.Substring(0, speedEqualsIndex).Trim(); string speedValue = part.Substring(speedEqualsIndex + 1).Trim(); // 给对应的速度控件赋值 switch (speedKey) { case "失速速度": Vs.Text = speedValue; break; case "巡航速度": Vcr.Text = speedValue; break; case "长时巡航速度": Vltr.Text = speedValue; break; case "爬升速度": Vclmb.Text = speedValue; break; } } break; // 同理处理其他单行多值的参数组 case "效率参数 - 巡航效率": var effParts = value.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); foreach (var part in effParts) { int effEqualsIndex = part.IndexOf('='); if (effEqualsIndex == -1) continue; string effKey = part.Substring(0, effEqualsIndex).Trim(); string effValue = part.Substring(effEqualsIndex + 1).Trim(); switch (effKey) { case "巡航效率": E.Text = effValue; break; case "爬升效率": Eclmb.Text = effValue; break; } } break; // 继续添加其他单行多值的参数组处理逻辑 case "升阻比参数 - 巡航升阻比": var cParts = value.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries); foreach (var part in cParts) { int cEqualsIndex = part.IndexOf('='); if (cEqualsIndex == -1) continue; string cKey = part.Substring(0, cEqualsIndex).Trim(); string cValue = part.Substring(cEqualsIndex + 1).Trim(); switch (cKey) { case "巡航升阻比": Ccr.Text = cValue; break; case "长时巡航升阻比": Cltr.Text = cValue; break; case "爬升升阻比": Cclmb.Text = cValue; break; } } break; // 载荷系数、功率参数的处理逻辑和上面类似,这里不再重复写全 } } } } }
读取代码说明:
- 键值对匹配赋值:通过拆分每行的
键=值,用switch匹配键来给对应控件赋值,不怕文件行顺序变动。 - 单行多值处理:对同一行的多个参数,先按分隔符拆分,再逐个拆分每个子项的键和值,完成赋值。
- 容错机制:跳过空行和格式错误的行,避免程序崩溃。
最终保存的Txt示例
修改后生成的文件内容会变成这样,清晰直观:
证书编号=Light Sport Aircraft 飞机型号=Tek Motorlu Pervaneli Uçak Tip A 飞行类型=Kompozit 材料类型=Atmosferik 发动机型号=Piston Motor 压缩系数=0,866 机组人员重量=82 座位数量=2 行李重量=10 飞行速度 - 失速速度=19,5, 巡航速度=51,25, 长时巡航速度=40, 爬升速度=30 最大航程=1100 效率参数 - 巡航效率=1, 爬升效率=0,3 升阻比参数 - 巡航升阻比=0,45, 长时巡航升阻比=0,45, 爬升升阻比=0,45 起飞燃油=1 储备燃油=5
内容的提问来源于stack exchange,提问作者Harun
相关产品推荐
相关产品推荐

