2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5, 6  След.
 
 Делфи. Вопросы возникающие в ходе обучения
Сообщение04.04.2009, 17:30 


04/03/09
91
Вопрос в названии темы, как открыть любой файл, для того что бы скопировать с него данные именно в шестнадцатеричном представлении. Так же, как можно осуществить чтение из этого файла скажем по 10 байт?.. Спасибо..
***
Это не условие задачи, это часть программы которую я пишу под свои нужды..

Добавлено спустя 26 минут 57 секунд:

вопрос поверну иначе...
Открываю файл как текстовый, соответственно как считать из него 10 байт вполне очевидно... Но не очевидно, как преобразоывать эти 10 байт в шестнадцатеричное представление?

 Профиль  
                  
 
 
Сообщение04.04.2009, 17:47 
Заслуженный участник


12/07/07
4522
На исходный вопрос
См. в справке BlockRead, BlockWrite.
Пример
Код:
var
f: file;
buf : array[1..10] of Byte;
i: Integer;
begin
Assign(f, 'delme.dat');        {delme.dat - имя дискового файла}
Rewrite(f, 1);                 {открываем на чтение/запись по одному байту}
for i:= 1 to 10 do buf[i]:= i;
BlockWrite(f, buf, sizeOf(buf));{заносим из buf sizeOf(buf) - 10 байт}
for i:= 1 to 10 do buf[i]:= 0;
Close(f);
Reset(f, 1);                   {открываем на чтение/запись по одному байту}
BlockRead(f, buf, sizeOf(buf));{читаем в buf sizeOf(buf) - 10 байт}
Close(f)
end.

 Профиль  
                  
 
 
Сообщение04.04.2009, 17:53 


04/03/09
91
GAA
спасибо большое)), думаю вопрос можно закрыть)

 Профиль  
                  
 
 Делфи. Вывод типизированных данных в файл.
Сообщение09.04.2009, 01:04 


04/03/09
91
Здравсвствуйте.. Столкнулся с проблемой.. Догадываюсь в чем дело, но исправить не могу... Вобщем write - где-то хранит данные в буфере, как этот буфер обнулить?
Проблема в том, что когда я вывожу в файл такую структуру:
Код:
  RgString=record
    color:TColor;
    typeDtrmn:char;
    regular:string[255];
    extension:string[20];
    group:string[20];
  end;

в файл выводится вся структура целиком. Если она была первый раз заполнена не полностью, то всё нормально, вместо пустот вставляются нули.
Если же эту структуру заполнить полностью, потом вывести в файл - тоже все нормально. Но при очередном выводе неполной структуры вместо нулей вставляется то, что было заполнено предыдущий раз..
пример:
Цитата:
первый проход:
fffff h texttexttexttext dsfsdf sdfsdf
второй
fffff h texttexttexttextPPPPPPPPPPPPPPPPPPP dsfsdf sdfsdf
третий
fffff h aeaeaeaeaeaeaeaeaeawawawawPPPPPPPPP dsfsdf sdfsdf

вот так примерно получается. Разумеется нули я опустил...
вывожу так

Код:
var
f:file of RGstring;
struct:RGstring;
begin
write(f,struct);
end;

 Профиль  
                  
 
 
Сообщение09.04.2009, 07:13 
Заслуженный участник


11/05/08
32166
Student2007 в сообщении #203281 писал(а):
Если же эту структуру заполнить полностью, потом вывести в файл - тоже все нормально. Но при очередном выводе неполной структуры вместо нулей вставляется то, что было заполнено предыдущий раз..

А причём тут write и её буфера? Что осталось в переменной, то она и выводит.

Для обнуления просто подайте команду
Код:
FillChar(struct, SizeOf(struct), #0);

 Профиль  
                  
 
 
Сообщение09.04.2009, 08:51 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
 !  PAV:
Темы объединены в одну. Просьба дальнейшие вопросы по близкой тематике обсуждать именно здесь, не создавая новых тем

 Профиль  
                  
 
 
Сообщение09.04.2009, 14:07 


04/03/09
91
ewert
спасибо, теперь всё работает как надо.. А я думал, что обнулял структуру следующим образом (поэтому и подумал на буфер write):
Код:
    struct.color:=0;
    struct.typeDtrmn:=#0;
    struct.regular:='';
    struct.extension:='';
    struct.group:='';

PAV
Учту на будущее...

 Профиль  
                  
 
 
Сообщение09.04.2009, 14:22 
Заслуженный участник


11/05/08
32166
Student2007 в сообщении #203397 писал(а):
Код:
struct.regular:='';
struct.extension:='';
struct.group:='';

Присвоение строке пустого значения, скорее всего, не меняет содержимое памяти, а просто сбрасывает в ноль счётчик длины. В файл же выводится вся память, отведённая под запись.

 Профиль  
                  
 
 
Сообщение15.04.2009, 20:19 


04/03/09
91
итак, появился еще один вопрос, возможно он некоторым покажется уж слишком легким.. Суть его в следующем:
есть два массива, каждая ячейка которых имеет один байт инофрмации. Нужно выделить общие элементы массивов, но не как множеств, потому что порядок следвоания элементов значение имеет. Нулевые элементы в работе не понадобятся, поэтому их можно использовать в качестве флажков.
Теперь как я себе представляю решение.

Код:
for i:=0 to k do begin
   if (a[i] AND b[i] <> a[i] then begin
      a[i]:=0;
      b[i]:=0;
   end;
end;


тоесть я тут неравные элементы обнулил. Далее формируется третий массив, данные в который заносятся из массива a[i] пропуская нули..
***********
что-то мне подсказывает, что есть более простое и изящное решение, чем мое. Программа большая и я хочу по-минимуму использовать циклы и операторы сравнения...
И еще такой вопрос: любая программа, там где много циклов, сильно есть ресурсы компьютера, процессор загружается наполную.. Как-нибудь можно сделать так, что бы программа использовала строго отведенное для нее количество ресурсов? :oops:
Заранее спасибо за ответ=)

 Профиль  
                  
 
 
Сообщение15.04.2009, 20:34 
Заслуженный участник


11/05/08
32166
Student2007 в сообщении #205144 писал(а):
что-то мне подсказывает, что есть более простое и изящное решение, чем мое.

Нет, ничего принципиально другого не придумаешь. Только запись у Вас какая-то странная (не говоря уж о синтаксических ошибках). Надо так:

Код:
for i:=1 to k do
    if a[i]=b[i]
        then c[i]:=a[i]
        else c[i]:=0;

 Профиль  
                  
 
 
Сообщение15.04.2009, 20:51 


04/03/09
91
ewert
ну синтаксические ошибки, потому что перед монитором с утра сижу... Уже просто не перевариваю текст с монитора, писал сходу... Спасибо за ответ...
а возможно ли без операторов сравнения как-то получить из двух строчек

Цитата:

ff ab 31 24 75 и
ff ab 22 24 88

получить одну вида:
Цитата:
ff ab 0 24 0

Если использовать оператор и, то получаю почти то, что нужно, только вместо первого нуля получаю другое число, а второе нуль (но можеть быть и не ноль, если другие значения будут).. В принципе для этого замут с массивами мне нужен.

Добавлено спустя 4 минуты 12 секунд:

это не строки, а шестнадцатеричные числа

 Профиль  
                  
 
 
Сообщение15.04.2009, 20:54 
Заслуженный участник


11/05/08
32166
Оператор сравнения -- вполне безобиден. После трансляции он превратится в одну команду сравнения и, возможно (в зависимости от результата), ещё одну команду принудительного перехода. Не считая, конечно, команд пересылки и индексации, которые в любом варианте необходимы. Любая попытка задействовать вместо этого арифметико-логические операции может и пройдёт, но лишь увеличит время работы и объём программы.

 Профиль  
                  
 
 
Сообщение15.04.2009, 21:14 


04/03/09
91
ewert
понял, спасибо:)

 Профиль  
                  
 
 
Сообщение15.04.2009, 21:52 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Если разрабатывается процедура, для которой время выполнения критично, то от условных операторов нужно избавляться. Даже если вместо него будет несколько арифметических (а лучше - логических побитовых) операций, то это может существенно ускорить работу (хотя наглядность программы, безусловно, упадет). Рекомендую почитать книгу Уоррен Г. — Алгоритмические трюки для программистов, фактически справочник по такого рода приемам. Данную задачу, безусловно, можно переписать без оператора if более или менее оптимальным способом. Если речь идет о работе с большими массивами и операция должна производится очень быстро, то это можно сделать. Другое дело, то программы с такими требованиями на Дельфи, наверное, все-таки не пишут...

 Профиль  
                  
 
 
Сообщение15.04.2009, 21:58 


04/03/09
91
PAV
таких строк у меня примерно 1000, их длина около 200 байт.. По времени - есть задержка на обработку.., что не критично. Критично другое - загрузка процессора на 100 процентов. Ну или ядра на 100%.. Вот такие моменты я даже предположить не могу, как обойти..
Уоррен Г. — Алгоритмические трюки для программистов - есть у меня такая книга, как раз сегодня скачал, спасибо:).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 84 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group