繁体   English   中英

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

[英]Editing a line in a text file without using pointers?

我正在尝试编辑文本行(.Hex文件),其中包含所有十六进制字符,而不使用指针,并且效率更高。

它花费了很长时间,因为我必须对该程序进行一些编辑(从hex文件的地址值中大约30x4字节或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;
}

假设您不想大量重写现有的逻辑,即“针对每一行,请执行此搜索和替换逻辑”,那么我认为最简单的更改是:

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. 您对内存中的字符串数组进行更改
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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM