You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在一行写入多字符串?及为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}");
        }
    }
}

核心改动说明:

  1. 添加数据描述:用$"描述={控件.Text}"的插值语法,直接生成键=值格式的行,可读性拉满。
  2. 一行多内容写入:把多个相关数据放在同一个WriteLine里,用逗号或其他分隔符隔开,比如write.WriteLine($"飞行速度 - 失速速度={Vs.Text}, 巡航速度={Vcr.Text}"),就能把多个内容写到同一行。
  3. 简化资源管理: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;
                    // 载荷系数、功率参数的处理逻辑和上面类似,这里不再重复写全
                }
            }
        }
    }
}

读取代码说明:

  1. 键值对匹配赋值:通过拆分每行的键=值,用switch匹配键来给对应控件赋值,不怕文件行顺序变动。
  2. 单行多值处理:对同一行的多个参数,先按分隔符拆分,再逐个拆分每个子项的键和值,完成赋值。
  3. 容错机制:跳过空行和格式错误的行,避免程序崩溃。

最终保存的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:56:28