Форум: "Начинающим";
Текущий архив: 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