Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
2-1291110259
vegarulez
2010-11-30 12:44
2011.02.27
обновление exe файла


2-1291121307
12
2010-11-30 15:48
2011.02.27
Запрос в потоке. Правильно пишу?


2-1291387318
vegarulez
2010-12-03 17:41
2011.02.27
[Twebbrowser+javascript] Получить переменные java


15-1289842022
Дмитрий С
2010-11-15 20:27
2011.02.27
Установка windows на флешку


15-1289322690
blacky1979
2010-11-09 20:11
2011.02.27
Посоветуйте компонет для отрисовки кинозала





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский