2014 dxdy logo

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

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




На страницу 1, 2, 3, 4, 5, 6  След.
 
 Делфи. Вопросы возникающие в ходе обучения
Сообщение04.04.2009, 17:30 
Вопрос в названии темы, как открыть любой файл, для того что бы скопировать с него данные именно в шестнадцатеричном представлении. Так же, как можно осуществить чтение из этого файла скажем по 10 байт?.. Спасибо..
***
Это не условие задачи, это часть программы которую я пишу под свои нужды..

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

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

 
 
 
 
Сообщение04.04.2009, 17:47 
На исходный вопрос
См. в справке 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 
GAA
спасибо большое)), думаю вопрос можно закрыть)

 
 
 
 Делфи. Вывод типизированных данных в файл.
Сообщение09.04.2009, 01:04 
Здравсвствуйте.. Столкнулся с проблемой.. Догадываюсь в чем дело, но исправить не могу... Вобщем 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 
Student2007 в сообщении #203281 писал(а):
Если же эту структуру заполнить полностью, потом вывести в файл - тоже все нормально. Но при очередном выводе неполной структуры вместо нулей вставляется то, что было заполнено предыдущий раз..

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

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

 
 
 
 
Сообщение09.04.2009, 08:51 
Аватара пользователя
 !  PAV:
Темы объединены в одну. Просьба дальнейшие вопросы по близкой тематике обсуждать именно здесь, не создавая новых тем

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

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

 
 
 
 
Сообщение09.04.2009, 14:22 
Student2007 в сообщении #203397 писал(а):
Код:
struct.regular:='';
struct.extension:='';
struct.group:='';

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

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

Код:
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 
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 
ewert
ну синтаксические ошибки, потому что перед монитором с утра сижу... Уже просто не перевариваю текст с монитора, писал сходу... Спасибо за ответ...
а возможно ли без операторов сравнения как-то получить из двух строчек

Цитата:

ff ab 31 24 75 и
ff ab 22 24 88

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

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

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

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

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

 
 
 
 
Сообщение15.04.2009, 21:14 
ewert
понял, спасибо:)

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

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

 
 
 [ Сообщений: 84 ]  На страницу 1, 2, 3, 4, 5, 6  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group