已添加具有相同键的字典错误项

时间:2018-03-23 04:35:49

标签: c# dictionary key-value

我正在尝试读取C ++标头中的每个#define,并为每个值显示一个编辑器,这样我就可以快速重新定义常量。

我正在尝试解析文件,让左侧的每个项目成为关键。我想在左侧显示值,编辑值并保存回来。目前,当我保存文件时,它会混淆格式。

这是我目前的代码:

private String header;
private Dictionary<String, String> tokens;
private String file = Properties.Settings.Default.path_location;
public TextBox elf_naparm_zombie_developer;

public harrs_gsh_editor(string file)//TextBox elf_naparm_zombie_developer
{
    Properties.Settings.Default.path_location = file;
    Properties.Settings.Default.Save();
    loadweapon();
   // this.elf_naparm_zombie_developer = elf_naparm_zombie_developer;
}

public void loadweapon()
{
    this.tokens = File.ReadLines(this.file)
        .Select(line => Regex.Match(line, @"^\s*#define\s+(.+?)(\s+(.+?))?((\s*//)|$)"))
        .Where(m => m.Success && m.Groups[3].Success)
        .ToDictionary(m => m.Groups[1].Value, m => m.Groups[3].Value);
}

public String Search(String name)
{
    foreach (KeyValuePair<String, String> pair in tokens)
    {
        if (pair.Key == name)
            return pair.Value;
    }

    return null;
}

public void Set(String key, String val)
{
    tokens[key] = val;
}

public void Save(String file)
{
    using (StreamWriter sw = new StreamWriter(File.OpenWrite(file)))
    {
        sw.Write(header);
        foreach (KeyValuePair<String, String> pair in tokens)
        {
            sw.Write("\r\n" + pair.Key + "#define       " + pair.Value);
        }
    }
}

public void Save()
{
    this.Save(file);
}

我遇到的问题是当我将其保存回来时,它会弄乱文件并删除#define。我想要做的只是更改值并将其写回具有更改值的程序

这是file i want to edit

所以我想要做的是加载选定的键并显示我已经设法用我创建的代码做的值,但我正在写的问题是

我用来加载和填充文本框的代码

namespace Harry_s_Template_Editor

{

public partial class Form1 : Form
{

    harrs_gsh_editor elfghc;
    string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"/hb21_zm_ai_napalm.gsh";



    public Form1()
    {
        InitializeComponent();
        elfghc = new harrs_gsh_editor(path);//TextBox elf_naparm_zombie_developer
        elf_naparm_zombie_developer = elf_naparm_zombie_developer;
       // MessageBox.Show(path);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        elfghc.loadweapon();
        this.elf_naparm_zombie_developer.Text = elfghc.Search("NAPALM_ZOMBIE_DEVELOPER_DEBUG_PRINTS");
        elfghc.Set("NAPALM_ZOMBIE_DEVELOPER_DEBUG_PRINTS", elf_naparm_zombie_developer.Text);

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button2_Click(object sender, EventArgs e)
    {
        elfghc.Set("NAPALM_ZOMBIE_DEVELOPER_DEBUG_PRINTS", elf_naparm_zombie_developer.Text);
        elfghc.Save(path);
    }
}

}

当我保存文件时,我现在在尝试再次加载程序时出现此错误 error

提前感谢Yuki

file when saved back

1 个答案:

答案 0 :(得分:0)

原始回答:

为什么要按此顺序将其写回文件:sw.Write("\r\n" + pair.Key + "#define " + pair.Value);?在#define之后,\r\n不应该排在第一位吗?我原以为它应该是这样的:sw.Write("\r\n#define " + pair.Key + " " + pair.Value);

新答案(问题已更改)

您正在做的事情有两个问题:

  1. 您正在将键/值对写回文件,忽略原始文件中的标题和信用。如果您乐意将其剥离,那么这很好,但听起来这对您来说非常重要。因此,您需要读取文件,找到文件中的键,然后更新值并将更新的文件保存回磁盘。这比将一堆键/值对写入文件更困难。

  2. 第二个问题是您将文件写回磁盘的方式。根据{{​​3}} MSDN页面,File.OpenWrite具有以下行为:

  3.   

    如果文件已存在,OpenWrite方法将打开一个文件   path,或创建一个新文件(如果不存在)。对于现有的   文件,它不会将新文本附加到现有文本。代替,   它用新字符覆盖现有字符。如果你   覆盖一个更长的字符串(例如“这是对OpenWrite的测试   方法“)用较短的字符串(如”第二次运行“),文件将   包含混合的字符串(“OpenWrite的第二次运行测试   法”)。

    因此,这就是您获取受损文件的原因。您使用更新的键/值对覆盖前N个字节,文件的其余部分是原始文件中的重复数据。您可能希望使用以下内容,它将完全覆盖原始文件:

    using (StreamWriter sw = new StreamWriter(file, false))