在不使用指针的情况下编辑文本文件中的行?

时间:2010-08-24 01:15:33

标签: c# algorithm

我正在尝试编辑包含所有十六进制字符的文本文件(.Hex文件)的一行,而不使用指针并以更有效的方式。

这需要很长时间,因为程序我必须编辑一些(大约30x4字节或来自hex文件的地址值的30个浮点值)。

每次程序替换一个字节时,它会搜索整个文件并替换值,然后将新文件再次复制回另一个文件。这个过程重复30次,这非常耗时,因此看起来不合适。

什么是最有效的方法?

public static string putbyteinhexfile(int address, char data, string total)
{

    int temph, temphl, tempht;
    ushort checksum = 0;
    string output = null, hexa = null;
    StreamReader hex;
    RegistryKey reg = Registry.CurrentUser;
    reg = reg.OpenSubKey("Software\\Calibratortest");
    hex = new StreamReader(((string)reg.GetValue("Select Input Hex File")));
    StreamReader map = new StreamReader((string)reg.GetValue("Select Linker Map File"));
    while ((output = hex.ReadLine()) != null)
    {
        checksum = 0;
        temph = Convert.ToInt16(("0x" + output.Substring(3, 4)), 16);
        temphl = Convert.ToInt16(("0x" + output.Substring(1, 2)), 16);
        tempht = Convert.ToInt16(("0x" + output.Substring(7, 2)), 16);
        if (address >= temph && 
            address < temph + temphl && 
            tempht == 0)
        {
            output = output.Remove((address - temph) * 2 + 9, 2);
            output = output.Insert((address - temph) * 2 + 9, 
                     String.Format("{0:X2}", Convert.ToInt16(data)));

            for (int i = 1; i < (output.Length - 1) / 2; i++)
                checksum += (ushort)Convert.ToUInt16(output.Substring((i * 2) - 1, 2), 16);

            hexa = ((~checksum + 1).ToString("x8")).ToUpper();
            output = output.Remove(temphl * 2 + 9, 2);
            output = output.Insert(temphl * 2 + 9, 
                                   hexa.Substring(hexa.Length - 2, 2));
            break;
        }
        else total = total + output + '\r' + '\n';
    }

    hex.Close();
    map.Close();

    return total;
}

2 个答案:

答案 0 :(得分:3)

假设您不想大规模重写现有的逻辑,即“为每一行执行此搜索并替换逻辑”,我认为最简单的更改是:

var lines = File.ReadAllLines(filePath);
foreach (change to make)
{
    for (int i = 0; i < lines.Length; i++)
    {
        // read values from line
        if (need_to_modify)
        {
            // whatever change logic you want here.
            lines[i] = lines[i].Replace(...);
        }
    }
}
File.WriteAllLines(filePath, lines);

基本上,你仍然会做你现在的逻辑,除了:

  1. 您只读了一次文件而不是N次
  2. 你摆脱了streamreader / streamwriter的工作
  3. 您对内存中的字符串数组进行了更改

答案 1 :(得分:0)

string fileName = "blabla.hex";
StreamReader f1 = File.OpenText(fileName);
StreamWriter f2 = File.CreateText(fileName + ".temp_");

while (!f1.EndOfStream)
{
    String s = f1.ReadLine();
    //change the content of the variable 's' as you wish 
    f2.WriteLine(s);   
}

f1.Close();
f2.Close();
File.Replace(fileName + ".temp_", fileName, null);