【发布时间】:2018-03-23 04:35:49
【问题描述】:
我正在尝试读取 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。我想要做的只是更改值并将其写回具有更改值的程序
所以我想要做的是加载选定的键并显示我设法用我创建的这段代码做的值,但我遇到的问题是将它写回来
我用来加载和填充文本框的代码
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
提前感谢由纪
【问题讨论】:
-
您还缺少上面代码的类定义,请您补充一下吗?哪怕只是代码顶部的
public class Form1 : Form,看看还是有帮助的 -
为什么要按这个顺序写回文件:
sw.Write("\r\n" + pair.Key + "#define " + pair.Value);?#define不应该在\r\n之后排在第一位吗?我原以为应该是这样的:sw.Write("\r\n#define " + pair.Key + " " + pair.Value); -
是的,它设法解决了我遇到的唯一问题,尽管它删除了所有学分和类似的东西并破坏了它的所有格式,这里是写回它pastebin.com/sR8cVHgn,你可以看到另一个它删除了所有学分并删除了所有开始的东西
-
我建议切换到 xml 文件。这允许拥有不同的类别,并且 .net 已经有用于阅读和编辑它们的库。也许最好的部分是,标题信息将位于一个单独的元素中,并且在您编辑其他部分时可以保持不变。另一个优点是,通过将设置放在一个类中,您可以直接从 xml 反序列化它们。
标签: c# dictionary key-value