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

Вниз

преобразование из PChar в string?   Найти похожие ветки 

 
ilka ©   (2003-10-07 19:45) [0]

Привет мастерам не подскажите как можно преобразование из PChar в string?


 
Иван Шихалев ©   (2003-10-07 19:47) [1]

:=


 
Palladin ©   (2003-10-07 19:53) [2]

они совместимы... зачем преобразовывать...


 
ilka ©   (2003-10-07 19:59) [3]

вот чтение файла на последней строке вылетает..


iFileHandle := FileOpen("1.txt", fmOpenRead);
iFileLength := FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
Buffer := PChar(AllocMem(iFileLength + 1));
iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
FileClose(iFileHandle);
showmessage(IntToStr(strlen(Buffer)));


 
Иван Шихалев ©   (2003-10-07 20:02) [4]

Как вылетает - в смысле - какая ошибка. Да и преобразования PChar в string я что-то тут не вижу... Зато, вероятно, поможет
Buffer[iFileLength] := #0


 
Palladin ©   (2003-10-07 20:05) [5]

а сразу в string религия не позволяет?
var
buffer:string;
iFileHandle := FileOpen("1.txt", fmOpenRead);
iFileLength := FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
SetLength(Buffer,iFileLength);
iBytesRead := FileRead(iFileHandle, Buffer[0], iFileLength);
FileClose(iFileHandle);
showmessage(IntToStr(Length(Buffer)));


 
ilka ©   (2003-10-07 20:11) [6]

выезжает дебагер как для асемблера потом пишет Accsess Volation ..

Buffer[iFileLength] := #0 вылетает
Buffer[1] := #0 вылетает


 
Fay   (2003-10-07 21:16) [7]

Ку?
iBytesRead := FileRead(iFileHandle, Buffer ^, iFileLength);


 
Endi ©   (2003-10-07 23:40) [8]

Попробуй StrPas(const Str: PChar): string;


 
Ihor Osov'yak ©   (2003-10-08 00:31) [9]

2 [7] Fay (07.10.03 21:16)

Вы не правы, так как
function FileRead(Handle: Integer; var Buffer; Count: LongWord): Integer;

2 [3] ilka © (07.10.03 19:59)

немного близок к истине [4] Иван Шихалев © (07.10.03 20:02), но не совсем..

Попытаюсь сделать разбор полетов..

iFileHandle := FileOpen("1.txt", fmOpenRead);
// нет проверки на успешность открытия файла
iFileLength := FileSeek(iFileHandle,0,2);
// во первых - может возвратится нулевой размер или даже -1, если
// файл не был открыт успешно (кажется, практически проверить влом - вам нужно, Вы и проверайте)
FileSeek(iFileHandle,0,0);

Buffer := PChar(AllocMem(iFileLength + 1));
// вспоминаем, что iFileLength может иметь и 0 и даже -1 - то есть мы можем запросить 0 байт памяти.. как следствие - возврат nil указателя
// nil указатель может возвратится и в случае запроса больше чем нуля байт - но это уже клинический случай и в делфийской программе его можно не рассматривать

iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
// снова напоминание - что файл не открыт может быть.. В таком случае здесь вілета еще не будет, несмотря что Buffer тогда будет nil - так как ничего реально читаться не будет
FileClose(iFileHandle);
// снова напоминание о том, что файл может быть не открыт..

showmessage(IntToStr(strlen(Buffer)));
// во первых - буффер может быть nil - гарантированный вылет.
// но если это не так - то есть для случая, что файл открыт - то перед этим должно быть примерно то то, что говорил [4] Иван Шихалев © - так как в коце файла нет зеросимвола, а strlen его ожидает.. Но правл ли он полностью (Иван) - можно сказать только после того, как увидеть декларацию Buffer

Успехов..


 
kaif ©   (2003-10-08 00:40) [10]

StrPas


 
Ihor Osov'yak ©   (2003-10-08 01:00) [11]

Ладно, имхо рабочая версия (практически не проверял, но думаю работать будет)

procedure BBBBBB;
var
iFileHandle: Integer;
iFileLength: Integer;
iBytesRead: Integer;
Buffer: PChar;
begin
iFileHandle := FileOpen("1.txt", fmOpenRead);
if iFileHandle <= 0 then
exit;
try
iFileLength := FileSeek(iFileHandle, 0, 2);
if iFileLength <= 0 then
begin
ShowMessage("BlaBla");
exit;
end;
FileSeek(iFileHandle, 0, 0);
Buffer := PChar(AllocMem(iFileLength + 1));
if not assigned(Buffer) then
begin
ShowMessage("BlaBla2");
exit;
end;
try
iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
Buffer[iBytesRead] := #0;
ShowMessage(IntToStr(strlen(Buffer)));
finally
FreeMem(Buffer);
end;
finally
FileClose(iFileHandle);
end;
end;


 
icWasya ©   (2003-10-08 09:46) [12]

to [11]
и всё-таки

iBytesRead := FileRead(iFileHandle, Buffer ^, iFileLength);


 
Ihor Osov'yak ©   (2003-10-08 11:08) [13]

2 [12] icWasya © (08.10.03 09:46)

да, увы, согласен. Спасибо. Если бы написал Buffer: pointer; или PByteArray(а в похожих случаях случаях делаю имеено так, то вероятнее всего такой бы "опячятки" не сделал-бы..

И если уже дотошно подходить, то и Buffer[iBytesRead] := #0; - лишнее, так как (F1) AllocMem allocates a block of the given size on the heap. Each byte in the allocated buffer is set to zero.

Зы.. Но несмотря на опячатку, она была бы "обнаружена" при первом запуске на выполнение - я же предупреждал, что тестирования не делал :-)

Зы - протестированный вариант:

procedure BBBBBB;
var
iFileHandle: Integer;
iFileLength: Integer;
Buffer: PChar;
begin
iFileHandle := FileOpen("N:\1.html", fmOpenRead);
if iFileHandle <= 0 then
begin
ShowMessage("не нашли чего-то там");
exit;
end;

try
iFileLength := FileSeek(iFileHandle, 0, 2);
if iFileLength <= 0 then
begin
ShowMessage("BlaBla");
exit;
end;
FileSeek(iFileHandle, 0, 0);
Buffer := PChar(AllocMem(iFileLength + 1));
if not assigned(Buffer) then
begin
ShowMessage("BlaBla2");
exit;
end;
try
FileRead(iFileHandle, Buffer^, iFileLength);
ShowMessage(IntToStr(strlen(Buffer)));
finally
FreeMem(Buffer);
end;
finally
FileClose(iFileHandle);
end;

end;



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
14-65583
Zhouck
2003-10-02 12:53
2003.10.20
Звуковуха ForteMedia


3-65322
Dark Elf
2003-09-29 18:30
2003.10.20
Запрос к SQL Server


3-65394
AccessHelp
2003-09-26 18:30
2003.10.20
Access


14-65631
Empleado
2003-09-30 19:32
2003.10.20
Вопрос про internet


3-65351
konst
2003-09-29 12:29
2003.10.20
сортировка Query