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

Вниз

Динамический массив и чтение из файла...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
1-1105430239
Раптон
2005-01-11 10:57
2005.01.23
Как вывести поверх картинки TLabel?


4-1101833290
Георгий
2004-11-30 19:48
2005.01.23
Создать текстовой файл на десктопе


1-1105610366
first_may
2005-01-13 12:59
2005.01.23
Интерфейс IXMLDOMDocument


14-1104215410
Rouse_
2004-12-28 09:30
2005.01.23
C Днем Рождения 28 Декабря


1-1104858342
Sun bittern
2005-01-04 20:05
2005.01.23
WIN32_FIND_DATA (большой размер файла)