Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-65390
Julia
2003-09-27 15:11
2003.10.20
автоподстановка


3-65393
Nick-From
2003-09-05 14:18
2003.10.20
Избежание переполнения таблиц


3-65365
MVVD
2003-09-29 12:44
2003.10.20
Чудеса с сервером


3-65327
Ренат
2003-09-30 08:27
2003.10.20
Значение типа дата в строковое поле


4-65665
=SOFT=
2003-08-14 17:57
2003.10.20
Как создать процес и узнать что он завершился?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский