Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.27;
Скачать: CL | DM;

Вниз

Способ прочитать с диска - правильно так?   Найти похожие ветки 

 
privet123   (2010-12-02 16:21) [0]

var ph:pchar; d,n:integer;
begin
getmem(ph,n); //n определяется в процессе
d:=fileopen("имя файла",fmopenread);
fileread(d,ph^,n);
fileclose(d);
ph[i]=доступ к каждому символу

Это работает, и без ошибок, но pchar же это строка, и конец её - нулевой символ. Тем не менее, даже бинарные файлы со многими нулями так считываются. Когда и кто её может, например, обрезать по первому встреченному нулю? то есть когда этот способ не сработает?


 
Ega23 ©   (2010-12-02 16:26) [1]


> но pchar же это строка, и конец её - нулевой символ


PChar - это указатель на тип Char. У него нет конца, это Pointer.


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


TMemoryStream, TFileStream, TStringStream - читать справку.


 
privet123   (2010-12-02 17:41) [2]

я не хочу использовать потоки, я привёл пример, похожее на то, что мне надо.
без стреамов ответ нужен.


 
privet123   (2010-12-02 17:44) [3]

строка df:=строка+chr(0)+cтрока 2.
df строка длинная, с нулём посередине.
df:=pchar(df); - строка 2 пропала


 
Dennis I. Komarov ©   (2010-12-02 17:48) [4]


> Ega23 ©   (02.12.10 16:26) [1]

Ничего не напоминает? :)))))


 
Dennis I. Komarov ©   (2010-12-02 17:49) [5]


> я не хочу использовать потоки, я привёл пример, похожее
> на то, что мне надо.
> без стреамов ответ нужен.

Есть разумное объяснения своего ХОЧУ?


 
RWolf ©   (2010-12-02 17:52) [6]

PChar — не родной для Delphi формат строки, не нужно его использовать без крайней необходимости. В подавляющем большинстве случаев string подходит лучше.


 
Ega23 ©   (2010-12-02 17:56) [7]


> но pchar же это строка, и конец её - нулевой символ.



procedure TForm2.Button1Click(Sender: TObject);
var
 ss, s1, s2: AnsiString;
begin
 s1 := "123";
 s2 := "456";
 ss := s1 + #0 + s2;
 ShowMessage(IntToStr(Length(ss)));
 ShowMessage(ss);
end;

 
Подумай.


 
privet123   (2010-12-02 18:12) [8]

уважаемые, если не пишете ответ, то зачем участвовать?
может кто то прочитает вопрос и ответит? вместо переговоров с вашими знакомыми, которые что то своё вписывают и оффтопят?

попробую ещё уточнить - я привёл способ считывания из файла. аналогично и запись в файл. вопрос - есть ли ситуация, при которой данные будут искажены? при этом методе, который я привёл? то есть не верно прочитаются из файла, верно прочитаются, но т.к. pchar исказятся и подобное?


 
Игорь Шевченко ©   (2010-12-02 18:29) [9]


> Это работает, и без ошибок, но pchar же это строка, и конец
> её - нулевой символ. Тем не менее, даже бинарные файлы со
> многими нулями так считываются


ну да


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


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


 
Anatoly Podgoretsky ©   (2010-12-02 19:13) [10]


> но pchar же это строка, и конец её - нулевой символ

Это заблуждение.


 
Anatoly Podgoretsky ©   (2010-12-02 19:14) [11]


> может кто то прочитает вопрос и ответит?

Ответы ты отвергаешь.


 
Ega23 ©   (2010-12-02 19:26) [12]


> попробую ещё уточнить - я привёл способ считывания из файла.
>  аналогично и запись в файл. вопрос - есть ли ситуация,
> при которой данные будут искажены? при этом методе, который
> я привёл? то есть не верно прочитаются из файла, верно прочитаются,
>  но т.к. pchar исказятся и подобное?


1. Отвечаю:
если написать правильно, то ничего не будет искажено. PChar отлично справляется с данной задачей.

2. Рекомендую:
TMemoryStream, TFileStream, TStringStream - читать справку. Также смотреть их код, благо он есть.

3. Подозреваю:
Опять в пустоту. Нужен код, которого не будет.


 
privet123   (2010-12-02 20:07) [13]

когда нужно записать динамический массив integer(int64) в файл, и не по одному члену массива в цикле, то этот способ удобен -
копировать массив в pchar, используя move, и записать. так же и прочитать.
код короткий, копировать надо не много. длина массива заранее не известна.
раз не искажается само - хорошо, всем спасибо :)


 
Игорь Шевченко ©   (2010-12-02 20:10) [14]


> когда нужно записать динамический массив integer(int64)
> в файл, и не по одному члену массива в цикле, то этот способ
> удобен -
> копировать массив в pchar, используя move, и записать. так
> же и прочитать.
> код короткий, копировать надо не много. длина массива заранее
> не известна.


записать нефиг делать.

но T(File)stream все равно лучше


 
RWolf ©   (2010-12-03 00:24) [15]


> privet123   (02.12.10 20:07) [13]
> то этот способ удобен

он неудобен хотя бы потому, что выделенную память придётся освобождать, и вполне вероятно, что это потянет за собой скобки try…finally.


 
Ega23 ©   (2010-12-03 01:36) [16]

Магнитка сёдня выиграла, поэтому я добрый и позитивный


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;


 
privet123   (2010-12-03 10:40) [17]

Ega23 ©
это похоже на способ, которым я записываю. попробую потоки, у вас даже вроде проще и нет записи в цикле, спасиб


 
Ega23 ©   (2010-12-03 10:45) [18]


> попробую потоки, у вас даже вроде проще и нет записи в цикле


Тебе это сказали ещё в [1], но "чукча не читатель, чукча писатель".


 
Anatoly Podgoretsky ©   (2010-12-03 11:51) [19]


> privet123   (02.12.10 20:07) [13]

Издеваешься?


 
privet123   (2010-12-05 17:48) [20]

Ega23 ©
скажите "в двух словах" почему WriteBuffer, а не Write? в чём вообще разница?


 
Ega23 ©   (2010-12-05 17:58) [21]


> скажите "в двух словах" почему WriteBuffer, а не Write?
> в чём вообще разница?


Справку посмотреть религия не позволяет?


 
privet123   (2010-12-05 18:24) [22]

у меня lazarus, в поисковиках пишут одинаково - люди просто используют то или это. ваш код работает, но стало интересно :)


 
Сергей М. ©   (2010-12-05 21:28) [23]


> в поисковиках пишут одинаково


Чего там "пишут одинаково" ?
Стало интересно)


 
privet123   (2010-12-06 11:07) [24]

я понимаю, это мой не верный ход - будто мне должны цитировать справку, вы не станете все, смысл в чём?
но - я же не сам придумал. мне не нужна справка, как то уж скачаю её, безлимит, ночью до 30 мегабит. не в этом дело.

на одном из сайтов я прочитал объяснение отличия try finally end от try except end - именно в двух словах. типа первое - если нужно, то есть главное, что бы что то было исполнено в любом случае - даже exit напишешь если в коде - всеравно исполнится то, что в области finally. а второе, если важно не это,  а перехватить ошибку и по своему обработать.
в подобном тоне в справке не пишут, не так ли? ;)

в подобном виде может кто то пояснить отличие write от writebuffer?


 
Ega23 ©   (2010-12-06 11:13) [25]


> в подобном тоне в справке не пишут, не так ли? ;)


Почему?


> в подобном виде может кто то пояснить отличие write от writebuffer?


Write - virtual; abstract; Должна быть перекрыта.
WriteBuffer - public; static;
Зачем write не protected - это есть вопрос.


 
privet123   (2010-12-06 11:16) [26]

Ega23 ©
конференция - начинающим, а вы используете не понятные термины. это не в том же виде.


 
Ega23 ©   (2010-12-06 11:20) [27]


> а вы используете не понятные термины.


Либо учи матчасть, либо забрасывай программирование, это не для тебя.
Я не могу объяснить, почему не рекомендуется вызывать перекрытый метод вместо статичного, не используя спец.термины.


 
Anatoly Podgoretsky ©   (2010-12-06 11:40) [28]

> privet123  (06.12.2010 11:16:26)  [26]

Рано ты еще себя к начинающим приписывать стал.



Страницы: 1 вся ветка

Текущий архив: 2011.02.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.009 c
15-1289987238
Scott Storch
2010-11-17 12:47
2011.02.27
Жесткий баг XE


2-1291707614
novichek
2010-12-07 10:40
2011.02.27
определить ОС


2-1291813130
Scott Storch
2010-12-08 15:58
2011.02.27
сравнение имен файлов по маске


15-1290029388
Юрий
2010-11-18 00:29
2011.02.27
С днем рождения ! 18 ноября 2010 четверг


2-1290929948
SIV5000
2010-11-28 10:39
2011.02.27
IShellFolder и диалог свойства файлов