Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 00:28   #1
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
Восклицание Как переместить участок в памяти?

Здравствуйте. Помогите в работе с памятью!

Я читаю в память весь файл (выдержка из кода)

Код:
pFile:= VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
ReadFile(hFile, pFile^, Size, Read, nil);
затем мне нужно сделать с ним некоторые преобразования, а именно взять 256 байт с конца и презаписать ими начало, а в конце 256 байт убрать или сократить size на 256 байт. Возможно ли сделать такое? В инете ничего на этот счёт не нашёл, по краней мере по делфи. Array of byte не предлогайте, как раз пытаюсь от этого уйти тк нужна память за пределами программы.
dolphin705 вне форума Ответить с цитированием
Старый 20.04.2012, 00:36   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Точно массив не подойдет?
Код:
const
N=256;
var
a:file of byte;
b:array[1..N] of byte;
begin
assignfile(a,'1.txt');
reset(a);
seek(a,filesize(a)-N);
blockread(a,b,N);
seek(a,0);
blockwrite(a,b,N);
seek(a,filesize(a)-N);
truncate(a);
closefile(a);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.04.2012, 01:36   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Есть готовый класс TFileStream. Используйте его, либо его начинку.
Человек_Борща вне форума Ответить с цитированием
Старый 20.04.2012, 09:59   #4
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

BDA, к сожалению нет, тк объёмы памяти довольно большие.

Человек_Борща, спасибо, но там вроде бы тоже внутренний буфер используется.

Последний раз редактировалось dolphin705; 20.04.2012 в 10:05. Причина: 1
dolphin705 вне форума Ответить с цитированием
Старый 20.04.2012, 10:09   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

dolphin705, большие объемы чего? Из вашего условия следует, что вам нужно только 256 байт дополнительной памяти
Или вы уже и так использовали всю память?
Код:
const
N=256;
var
a:file of byte;
b:byte;
i:integer;
begin
assignfile(a,'1.txt');
reset(a);
for i:=0 to N-1 do
begin
seek(a,filesize(a)-N+i);
read(a,b);
seek(a,i);
write(a,b);
end;
seek(a,filesize(a)-N);
truncate(a);
closefile(a);
Нужен 1 байт
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 20.04.2012 в 10:16.
BDA вне форума Ответить с цитированием
Старый 20.04.2012, 12:24   #6
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Извиняюсь, может просто не доскональна всё объяснил. В примере Size может быть до 100 и даже больше мегабайт. 256 байт это кусок переноса (к примеру). На сколько я знаю стек обычной программы 100 мб. точно не сможет вместить.
dolphin705 вне форума Ответить с цитированием
Старый 20.04.2012, 16:09   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Чего-то я не понял.

Открыли файл.
Спозиционировали в конец минус 256 байт.
Прочитали 256 байт.
Отрезали конец.
Перешли в начало.
Записали 256 байт.
Закрыли файл.

Это секундная операция даже на гиговых файлах.

Вопрос: нафига надо грузить в память файл целиком?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.04.2012, 16:28   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

dolphin705, стек-то может и 100 мб, но я умудрялся с помощью tmemorystream занимать всю оперативную память
Согласен с GunSmoker, вам не нужно загружать в память весь файл.
Способ с побайтовой перезаписью в моем посте выше не самый быстрый, но по памяти, наверное, самый "легкий".
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как переместить окно на экране? olga4eg Общие вопросы C/C++ 0 28.08.2010 23:06
Открыть файл как Hex найти там некий участок кода, заменить его и сохранить AstraZak Общие вопросы C/C++ 10 05.03.2010 18:58
Как переместить мигающий курсор? Сергей089 Паскаль, Turbo Pascal, PascalABC.NET 1 04.06.2009 17:35
Как переместить DXImageList ? SG13 Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 30.03.2008 11:54
Как переместить картинку? Костя Помощь студентам 2 23.12.2006 17:53