Редактирование строки в текстовом файле без использования указателей? - PullRequest
0 голосов
/ 24 августа 2010

Я пытаюсь редактировать строку текстового файла (файл .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;
}

Ответы [ 2 ]

3 голосов
/ 24 августа 2010

Предполагая, что вы не хотите массово переписывать существующую логику, которая делает «для каждой строки, выполните поиск и замену логики», я бы подумал, что простейшим изменением будет:

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. вы вносите свои изменения в массив строк в памяти
0 голосов
/ 24 августа 2010
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...