![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив и чтение из файла...
nicesc © (2005-01-12 15:50:00)Проблема при попытке прочитать данные из файла, в динмаически объявленный массив, возвращает 0, а если задать жестко - работает.
Причем я пробовал и с ф-ией BlockRead()
Вот последний вариант:
procedure TForm1.Button1Click(Sender: TObject);
var
tFile : THandle;
asmArr : array of byte; - если объявить как array[1..128]всё ок
len : integer;
numStr : cardinal;
str : string;
begin
len:=10;
SetLength(asmArr,len);
tFile:=CreateFileA('c:\1WORK\test.txt',GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
ReadFile(tFile,asmArr,SizeOf(asmArr),numStr,0);
str:=str+IntToStr(asmArr[1])+IntToStr(asmArr[2]));
ShowMessage(str);
CloseHandle(tFile);
asmArr:=nil;
end;
Anatoly Podgoretsky (2005-01-12 23:01:00) [1]Да ничего не скажешь, умеет.
Johnmen (2005-01-12 22:51:00) [2]>begin...end © (12.01.05 22:40) [7]
Красиво выкрутился...:)
begin...end (2005-01-12 22:40:00) [3]> [3] nicesc (12.01.05 21:54)
> так правильно
> ...
> BlockRead(disfile,asmArr[0],len*SizeOf(byte),reslt);
Это вопрос? :-) Если asmArr - это динамический массив, и Вы установили нужную его длину перед чтением, то, в общем-то, правильно.
Просто дело в том, что между переменной-статическим массивом и переменной-динамическим массивом есть существенное различие. Динамический массив представляет собой фактически указатель на начало данных, поэтому в процедурах типа BlockRead нужно в качестве переменной-буфера указывать первый (а точнее - нулевой) элемент динамического массива. Если же передать саму переменную динамического массива, то данные будут читаться в область памяти, где расположен указатель, а не сами элементы массива. Соответственно, размер переменной динамического массива равен 4 байтам (потому что это указатель), поэтому в BlockRead или ReadFile нужно передавать размер элемента массива, умноженный на их количество.
> [4] Johnmen © (12.01.05 22:04)
Это на случай, если byte - это его собственный тип :-)
Johnmen (2005-01-12 22:35:00) [4]Понятно... Более красивая запись единицы...
:)
Anatoly Podgoretsky (2005-01-12 22:19:00) [5]Ну равно 1
Johnmen (2005-01-12 22:04:00) [6]>begin...end © (12.01.05 15:55) [2]
Хм... А это SizeOf(Byte) к чему ?
:)
nicesc (2005-01-12 21:54:00) [7]begin...end/B>
Да точно! Зработало! Спасибо огромное, вы мне очень помогли
А попробовал с BlockRead, так правильно:
AssignFile(disFile,edtPath.Text);
Reset(disFile,1); <<< тут 1 обязательно!
Seek(disFile,iStr);
BlockRead(disfile,asmArr[0],len*SizeOf(byte),reslt);//,reslt);
begin...end (2005-01-12 15:55:00) [8]> nicesc (12.01.05 15:50)
> ReadFile(tFile,asmArr,SizeOf(asmArr),numStr,0);
ReadFile(tFile, asmArr[0], len * SizeOf(Byte), numStr, 0)
Ega23 (2005-01-12 15:53:00) [9]a c:\1WORK\test.txt существует?