Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];
Внизпреобразование из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c