![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Способ прочитать с диска - правильно так?
privet123 © (2010-12-02 16:21:00)var ph:pchar; d,n:integer;
begin
getmem(ph,n); //n определяется в процессе
d:=fileopen('имя файла',fmopenread);
fileread(d,ph^,n);
fileclose(d);
ph[i]=доступ к каждому символу
Это работает, и без ошибок, но pchar же это строка, и конец её - нулевой символ. Тем не менее, даже бинарные файлы со многими нулями так считываются. Когда и кто её может, например, обрезать по первому встреченному нулю? то есть когда этот способ не сработает?
Anatoly Podgoretsky (2010-12-06 11:40:00) [1]> privet123 (06.12.2010 11:16:26) [26]
Рано ты еще себя к начинающим приписывать стал.
Ega23 (2010-12-06 11:20:00) [2]
> а вы используете не понятные термины.
Либо учи матчасть, либо забрасывай программирование, это не для тебя.
Я не могу объяснить, почему не рекомендуется вызывать перекрытый метод вместо статичного, не используя спец.термины.
privet123 (2010-12-06 11:16:00) [3]Ega23 ©
конференция - начинающим, а вы используете не понятные термины. это не в том же виде.
Ega23 (2010-12-06 11:13:00) [4]
> в подобном тоне в справке не пишут, не так ли? ;)
Почему?
> в подобном виде может кто то пояснить отличие write от writebuffer?
Write - virtual; abstract; Должна быть перекрыта.
WriteBuffer - public; static;
Зачем write не protected - это есть вопрос.
privet123 (2010-12-06 11:07:00) [5]я понимаю, это мой не верный ход - будто мне должны цитировать справку, вы не станете все, смысл в чём?
но - я же не сам придумал. мне не нужна справка, как то уж скачаю её, безлимит, ночью до 30 мегабит. не в этом дело.
на одном из сайтов я прочитал объяснение отличия try finally end от try except end - именно в двух словах. типа первое - если нужно, то есть главное, что бы что то было исполнено в любом случае - даже exit напишешь если в коде - всеравно исполнится то, что в области finally. а второе, если важно не это, а перехватить ошибку и по своему обработать.
в подобном тоне в справке не пишут, не так ли? ;)
в подобном виде может кто то пояснить отличие write от writebuffer?
Сергей М. (2010-12-05 21:28:00) [6]
> в поисковиках пишут одинаково
Чего там "пишут одинаково" ?
Стало интересно)
privet123 (2010-12-05 18:24:00) [7]у меня lazarus, в поисковиках пишут одинаково - люди просто используют то или это. ваш код работает, но стало интересно :)
Ega23 (2010-12-05 17:58:00) [8]
> скажите "в двух словах" почему WriteBuffer, а не Write?
> в чём вообще разница?
Справку посмотреть религия не позволяет?
privet123 (2010-12-05 17:48:00) [9]Ega23 ©
скажите "в двух словах" почему WriteBuffer, а не Write? в чём вообще разница?
Anatoly Podgoretsky (2010-12-03 11:51:00) [10]
> privet123 (02.12.10 20:07) [13]
Издеваешься?
Ega23 (2010-12-03 10:45:00) [11]
> попробую потоки, у вас даже вроде проще и нет записи в цикле
Тебе это сказали ещё в [1], но "чукча не читатель, чукча писатель".
privet123 (2010-12-03 10:40:00) [12]Ega23 ©
это похоже на способ, которым я записываю. попробую потоки, у вас даже вроде проще и нет записи в цикле, спасиб
Ega23 (2010-12-03 01:36:00) [13]Магнитка сёдня выиграла, поэтому я добрый и позитивный
procedure TForm1.Button1Click(Sender: TObject);
var
arr: array of Int64;
i, arrLen: Integer;
fs: TFileStream;
begin
arrLen := 10;
SetLength(arr, arrLen);
for i := 0 to arrLen - 1 do
arr[i] := i;
fs := TFileStream.Create('c:\temp\1.dat', fmCreate);
try
fs.WriteBuffer(arrLen, SizeOf(Integer));
fs.WriteBuffer(arr[0], arrLen * SizeOf(Int64));
finally
fs.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
arr: array of Int64;
i, arrLen: Integer;
fs: TFileStream;
begin
fs := TFileStream.Create('c:\temp\1.dat', fmOpenRead or fmShareDenyNone);
try
fs.ReadBuffer(arrLen, SizeOf(Integer));
SetLength(arr, arrLen);
fs.ReadBuffer(arr[0], arrLen * SizeOf(Int64));
for i := 0 to arrLen - 1 do
Memo1.Lines.Add(IntToStr(arr[i]));
finally
fs.Free;
end;
end;
RWolf (2010-12-03 00:24:00) [14]
> privet123 (02.12.10 20:07) [13]
> то этот способ удобен
он неудобен хотя бы потому, что выделенную память придётся освобождать, и вполне вероятно, что это потянет за собой скобки try…finally.
Игорь Шевченко (2010-12-02 20:10:00) [15]
> когда нужно записать динамический массив integer(int64)
> в файл, и не по одному члену массива в цикле, то этот способ
> удобен -
> копировать массив в pchar, используя move, и записать. так
> же и прочитать.
> код короткий, копировать надо не много. длина массива заранее
> не известна.
записать нефиг делать.
но T(File)stream все равно лучше
privet123 (2010-12-02 20:07:00) [16]когда нужно записать динамический массив integer(int64) в файл, и не по одному члену массива в цикле, то этот способ удобен -
копировать массив в pchar, используя move, и записать. так же и прочитать.
код короткий, копировать надо не много. длина массива заранее не известна.
раз не искажается само - хорошо, всем спасибо :)
Ega23 (2010-12-02 19:26:00) [17]
> попробую ещё уточнить - я привёл способ считывания из файла.
> аналогично и запись в файл. вопрос - есть ли ситуация,
> при которой данные будут искажены? при этом методе, который
> я привёл? то есть не верно прочитаются из файла, верно прочитаются,
> но т.к. pchar исказятся и подобное?
1. Отвечаю:
если написать правильно, то ничего не будет искажено. PChar отлично справляется с данной задачей.
2. Рекомендую:
TMemoryStream, TFileStream, TStringStream - читать справку. Также смотреть их код, благо он есть.
3. Подозреваю:
Опять в пустоту. Нужен код, которого не будет.
Anatoly Podgoretsky (2010-12-02 19:14:00) [18]
> может кто то прочитает вопрос и ответит?
Ответы ты отвергаешь.
Anatoly Podgoretsky (2010-12-02 19:13:00) [19]
> но pchar же это строка, и конец её - нулевой символ
Это заблуждение.
Игорь Шевченко (2010-12-02 18:29:00) [20]
> Это работает, и без ошибок, но pchar же это строка, и конец
> её - нулевой символ. Тем не менее, даже бинарные файлы со
> многими нулями так считываются
ну да
> Когда и кто её может, например, обрезать по первому встреченному
> нулю? то есть когда этот способ не сработает?
например ты, если вызовешь какую-нибудь обрезающую функцию. В приведенном коде никто не может.