Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизДинамический массив и чтение из файла... Найти похожие ветки
← →
nicesc (2005-01-12 15:50) [0]Проблема при попытке прочитать данные из файла, в динмаически объявленный массив, возвращает 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;
← →
Ega23 © (2005-01-12 15:53) [1]a c:\1WORK\test.txt существует?
← →
begin...end © (2005-01-12 15:55) [2]> nicesc (12.01.05 15:50)
> ReadFile(tFile,asmArr,SizeOf(asmArr),numStr,0);
ReadFile(tFile, asmArr[0], len * SizeOf(Byte), numStr, 0)
← →
nicesc (2005-01-12 21:54) [3]begin...end/B>
Да точно! Зработало! Спасибо огромное, вы мне очень помогли
А попробовал с BlockRead, так правильно:
AssignFile(disFile,edtPath.Text);
Reset(disFile,1); <<< тут 1 обязательно!
Seek(disFile,iStr);
BlockRead(disfile,asmArr[0],len*SizeOf(byte),reslt);//,reslt);
← →
Johnmen © (2005-01-12 22:04) [4]>begin...end © (12.01.05 15:55) [2]
Хм... А это SizeOf(Byte) к чему ?
:)
← →
Anatoly Podgoretsky © (2005-01-12 22:19) [5]Ну равно 1
← →
Johnmen © (2005-01-12 22:35) [6]Понятно... Более красивая запись единицы...
:)
← →
begin...end © (2005-01-12 22:40) [7]> [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:51) [8]>begin...end © (12.01.05 22:40) [7]
Красиво выкрутился...:)
← →
Anatoly Podgoretsky © (2005-01-12 23:01) [9]Да ничего не скажешь, умеет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c