Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Способ прочитать с диска - правильно так?


Страницы:   1 2

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 же это строка, и конец
> её - нулевой символ. Тем не менее, даже бинарные файлы со
> многими нулями так считываются


ну да


> Когда и кто её может, например, обрезать по первому встреченному
> нулю? то есть когда этот способ не сработает?


например ты, если вызовешь какую-нибудь обрезающую функцию. В приведенном коде никто не может.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо