Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23

Подсчет смещения строк и байт в этих строках

22.10.2015, 12:52. Показов 1603. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пришли с другом в тупик. А именно, ранее была написана прога, которая выполняла то, что написано в оглавлении. Делала она все правильно. Потом, спустя какое-то время, сгорел хард, соответственно исходники были потеряны, но благо копия первоначальных версий была на другом харде. И вот проблема, есть код, который работает не совсем правильно. Суть проги заключалась в подсчете байт в строке и смещении каждой строки с заданным начальным смещением. Кол-во байт в строке должно просчитываться в таком виде: вся латиница и символы = 1 байт, вся кириллица = 2 байта.
Пример:
то, что подвергается подсчету,
C#
1
2
4720349 ucdt    Газовая Граната
5404723 ucdt    ChangeCamera
результат
C#
1
2
4720349 157 42  d
5404723 201 25  d
В результате:
1 - ID он не меняется,
2 - смещение (=кол-во байт пред.строки + 2)
3 - кол-во байт в строке (латиница и символы = 1 байт, кириллица = 2 байта)
4 - необходимый символ (просто дописывается в конце)

Вот сам код проги (помогите понять, в чем проблема при подсчёте (дело в том, что она все символы считает, как 1 байт)):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
unit H1Z1_LC;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, System.RegularExpressions, md5;
 
type
  TForm5 = class(TForm)
    mmo1: TMemo;
    mmo2: TMemo;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    lbl1: TLabel;
    edt1: TEdit;
    pb1: TProgressBar;
    dlgOpen1: TOpenDialog;
    dlgSave1: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form5: TForm5;
  ProcessCancel: Boolean;
 
implementation
 
{$R *.dfm}
 
procedure TForm5.btn1Click(Sender: TObject);  // Открыть файл
begin
mmo1.Clear;
mmo2.Clear;
mmo2.ReadOnly:= True;
btn2.Caption:= 'Запуск';
btn2.Enabled:= False;
btn3.Enabled:= False;
pb1.Position:= 0;
dlgOpen1.Filter:='Data Files|*.dat';
if dlgOpen1.Execute then begin
mmo1.Lines.LoadFromFile(dlgOpen1.FileName); // Показываем пользователю содержимое DAT файла
// Создание шаблона для DIR файла
mmo2.Lines.Add('## CidLength:   88');
mmo2.Lines.Add('## Count:   2897');
mmo2.Lines.Add('## Date:    Wed Feb 11 17:45:29 PST 2015');
mmo2.Lines.Add('## Game:    ND');
mmo2.Lines.Add('## Locale:  en_US');
mmo2.Lines.Add('## MD5Checksum: '+MD5DigestToStr(MD5File(dlgOpen1.FileName))); // Читаем хэш сумму DAT файла и записываем её сюда
mmo2.Lines.Add('## T4Version:   Unknown');
mmo2.Lines.Add('## TextLength:  457');
mmo2.Lines.Add('## Version: 2.1.886508');
btn2.Enabled:= True;
edt1.Enabled:= True;
end;
end;
 
procedure TForm5.btn2Click(Sender: TObject); // Конвертировать
var
ms: TMemoryStream;
re: TRegEx;
s, s1: RawByteString;
mc: TMatchCollection;
i, len, n: Integer;
begin
  ProcessCancel:= False; // Процесс конвертирования запущен
  btn1.Enabled:= False;
  btn2.Enabled:= False;
  btn2.Caption:= 'Подождите...';
  btn3.Enabled:= True;
  btn3.Caption:= 'Отмена';
  edt1.Enabled:= False;
  mmo2.ReadOnly:= True;
 
  n:= StrToInt(edt1.Text);             // Чтение числа из Edit NumberOnly
  ms:= TMemoryStream.Create;           // Если в файле присутствует кириллица (что нам очень нужно), то весь блок зависает, а затем выдаёт ошибку Out Of Memory
  ms.LoadFromFile(dlgOpen1.FileName);  // Файл должен загружаться как UTF-8 BOM, но похоже он так не загружается.
  ms.Position:= n;
  SetLength(s, ms.size - ms.Position);
  CopyMemory(PAnsiChar(s), ms.Memory, Length(s));
  ms.Free;
  re.Create('([0-9]+)[\t|\s]+.*');
  mc := re.Matches(s);
  pb1.Max:= mc.Count - 1;
  pb1.Position:= 0;
    for i := 0 to mc.Count - 1 do
    begin
    Application.ProcessMessages;
    if ProcessCancel=False then begin
    s1 := mc[i].Value;
    len := Length(s1);
    s1 := mc[i].Groups[1].Value;
    mmo2.Lines.Add(s1 + #9 + IntToStr(n) + #9 + IntToStr(len) + #9 + 'd');
    n:= n + len + 2;
    pb1.Position:= pb1.Position + 1;
    end
    else
    begin
    pb1.Position:= 0;
    btn3.Enabled:= False;
    btn3.Caption:= 'Сохранить';
    btn1.Enabled:= True;
    btn2.Caption:= 'Запуск';
    mmo1.Clear;
    mmo2.Clear;
    Exit;
    end;
    end;
    btn3.Enabled:= True;
    btn3.Caption:= 'Сохранить';
    btn1.Enabled:= False;
    btn2.Caption:= 'Готово';
    btn1.Enabled:= True;
    ProcessCancel:= True;
    mmo2.ReadOnly:= False;
end;
 
 
procedure TForm5.btn3Click(Sender: TObject);
begin
if ProcessCancel=False then begin
ProcessCancel:= True;
btn1.Enabled:= True;
btn2.Enabled:= False;
mmo2.ReadOnly:= True;
btn2.Caption:= 'Запуск';
btn3.Caption:= 'Сохранить';
end
else
begin
dlgSave1.Filter:='DIR Files|*.dir';
if dlgSave1.Execute then begin
mmo2.Lines.SaveToFile(dlgSave1.FileName+'.dir'); // Этот файл должен быть в кодировке ANSI
end;
end;
end;
 
procedure TForm5.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= True;
if ProcessCancel=False then begin
if MessageBoxA(Form5.Handle, 'Вы действительно хотите закрыть конвертер? Если процесс запущен, он будет отменён', 'Предупреждение', MB_YESNO or MB_ICONWARNING) = IDNO then begin
CanClose:= False;
end
else
begin
ProcessCancel:= True;
end;
end;
end;
 
procedure TForm5.FormCreate(Sender: TObject);
begin
mmo1.Clear;
mmo2.Clear;
edt1.Text:= '3';
ProcessCancel:= True; // Конвертация ещё не выполняется.
end;
 
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2015, 12:52
Ответы с готовыми решениями:

Подсчет смещения строк
Привет. Помогите написать алгоритм смещения строки по такому принципу: Например у нас есть несколько строк 11535759 ucdt ADD NEW CARD ...

Найти все буквы заданных строк, которые встречаются во всех этих строках.
Найти все буквы заданных строк, которые встречаются во всех этих строках.

Найти все буквы заданных строк, которые встречаются во всех этих строках
Найти все буквы заданных строк, которые встречаются во всех этих строках.

5
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
22.10.2015, 20:08
Цитата Сообщение от fenymak Посмотреть сообщение
то, что подвергается подсчету
Лучше бы привел образец оригинального файла ..
0
0 / 0 / 0
Регистрация: 08.02.2015
Сообщений: 23
23.10.2015, 00:24  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Лучше бы привел образец оригинального файла ..
Вот первая тема была.

Во вложениях файлы. dat - то, что нужно просчитать, а dir - уже просчитанный первой прогой, т.е. должно получится именно то, что в dir файле.
Вложения
Тип файла: zip Locale.zip (118.0 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 14
25.10.2015, 11:26
Всем привет. Вот у меня наконец перестала болеть голова и я сам решил все ошибки кода.

В соседней теме мне уже давали коды преобразователя.

Итак:
1. Код который выкладывали для использования в Delphi XE. У меня на Delphi XE 4 не работает корректно даже с латиницей. Ошибаясь на 1 - 2 байта и смещения. А уж если в файле DAT попадётся кириллица. То этот код вообще зависает, а затем валится с ошибкой Out Of Memory.

2. Решил использовать код который дали для Delphi 7. Он заработал на Delphi XE на ура, но только с латиницей.
Теперь, о том как я заставил его работать с кириллицей:

Так как у меня болела голова, я не сразу понял что этот код был расчитан на ANSI кодировку. С которой по умолчанию работает Delphi 7.

Но я же собирал код на Delphi XE. А он загрузил файл с кодировкой Юникод. Отсюда всё и началось.
Когда я перестал болеть, то понял это и добавил при загрузке файла, перекодировку в ANSI. После этого код стал чудесно работать с латиницей и кириллицей, подсчёт данных стал срабатывать один к одному с оригиналом.

Спасибо FIL за этод код
0
0 / 0 / 0
Регистрация: 04.10.2017
Сообщений: 1
04.10.2017, 01:08
Hello there

I need this program for PlanetSide 2. If you do not mind, would you share this with me?
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,425
Записей в блоге: 3
04.10.2017, 07:10
delidolu1adam, look at the date of the last message! In addition, the author of the topic was not on the forum for 1.5 years ... Who are you contacting?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2017, 07:10
Помогаю со студенческими работами здесь

Определить номера строк таблицы, начинающихся с одинаковых чисел, и подсчитать сумму элементов в этих строках
Дана прямоугольная таблица чисел А. Составить алгоритм, который определял бы номера строк таблицы, начинающихся с одинаковых чисел и...

Считывание из входного файла байт с N1 по N2 и с N3 по N4 и запись этих байт в выходной файл
Здравствуйте!Помогите пожалуйста написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти...

Удаление первой строки из каждой группы строк в файле, определяемой наличием в этих строках одинаковых дат
Здравствуйте, участники. Не силен в VBScript, поэтому прошу помощи в написании простейшей программки. Задача следующая: имеем текстовый...

Найти номера строк, которые содержат не более 2-х отрицательных элементов. В этих строках отрицательные элементы возвести в квадрат
Дана матрица C(5,4). Найти номера строк, которые содержат не более 2-х отрицательных элементов. В этих строках отрицательные элементы...

Добавление строк, взятых из одного файла, в другие файлы в случае отсутствия этих строк в этих файлах
Есть древо папок с файлами 2.apk\res\values\strings.xml 2.apk\res\values-ru\strings.xml 2.apk\res\values-en\strings.xml Папок вида ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru